劍指offer:刪去連結串列中重複的節點。(題解原始碼加圖解)
題目
劍指offer,刪除連結串列中的重複節點。
題目描述
在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。
示例1,連結串列1->2->3->3->4->4->5
處理後為 1->2->5
示例2
輸入
{ 1, 2, 3, 3, 4, 4 }
返回值
{ 1, 2 }
解析
因為是刪重,所以不保留重複節點。
用兩個指標cur 和next判斷是否重複,
1、如果不重複保留下來,此時需要上一個節點,用prev保留,為了方便第一個節點的連結,我們建立一個哨兵位的頭節點pphead。
2、重複了則不保留,釋放cur後,cur和next繼續向後走,直到他倆不同。
3、那麼cur和next走到NULL時又有兩種情況
情況1:最後一個數字保留,如示例1,最簡單,直接保留即可。
情況2:最後一個數字不保留,如示例2,此時需要釋放它,再將prev的下一個置NULL;
圖解
程式碼
#include<Windows.h>
#include<stdio.h>
#include <assert.h>
#pragma warning (disable:4996)
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL || pHead->next == NULL)
{
return pHead;
}
ListNode*pphead = (ListNode*)malloc(sizeof(ListNode));
ListNode*prev = pphead;
pphead->next = pHead;
ListNode*cur = pHead;
ListNode*next = pHead->next;
while (next)
{
if (cur->val != next->val)
{
prev->next = cur;
prev = prev->next;
cur = cur->next;
next = next->next;
}
else
{
while (next->val == cur->val)
{
ListNode*temp = cur;
cur = next;
next = next->next;
free(temp);
if (next == NULL)
{
break;
}
}
free(cur);
cur = next;
if (next == NULL)
{
prev->next = cur;
}
else
{
next = next->next;
if (next == NULL)
{
prev->next = cur;
}
}
}
}
ListNode* realhead = pphead->next;
free(pphead);
return realhead;
}
//測試程式碼
int main()
{
ListNode*n6 = (ListNode*)malloc(sizeof(ListNode));
if (n6)
{
n6->val = 53;
n6->next =NULL;
}
ListNode*n5 = (ListNode*)malloc(sizeof(ListNode));
if (n5)
{
n5->val = 53;
n5->next = n6;
}
ListNode*n4 = (ListNode*)malloc(sizeof(ListNode));
if (n4)
{
n4->val = 666;
n4->next = n5;
}
ListNode*n3 = (ListNode*)malloc(sizeof(ListNode));
if (n3)
{
n3->val = 133;
n3->next = n4;
}
ListNode*n2 = (ListNode*)malloc(sizeof(ListNode));
if (n2)
{
n2->val = 133;
n2->next = n3;
}
ListNode*head = (ListNode*)malloc(sizeof(ListNode));
if (head)
{
head->val = 999;
head->next = n2;
}
ListNode* list = head;
while (head)
{
printf("%10d->", head->val);
head = head->next;
}
printf("NULL\n");
head = list;
while (head)
{
printf("%10p->", head);
head = head->next;
}
printf("NULL\n");
head = list;
ListNode* sortNode = deleteDuplication(head);
ListNode* cpylist = sortNode;
while (sortNode)
{
printf("%10d->", sortNode->val);
sortNode = sortNode->next;
}
printf("NULL\n");
sortNode = cpylist;
while (sortNode)
{
printf("%10p->", sortNode);
sortNode = sortNode->next;
}
printf("NULL\n");
system("pause");
}
相關文章
- 劍指offer-----刪除連結串列中的重複節點
- 牛客(刪除連結串列中重複節點)
- JZ76 刪除連結串列中重複的節點
- 劍指 Offer 35. 複雜連結串列的複製
- 劍指offer——連結串列中倒數第k個結點
- 力扣 - 劍指 Offer 22. 連結串列中倒數第k個節點力扣
- 劍指Offer-38-兩個連結串列的第一個公共節點
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 【連結串列問題】刪除單連結串列的中間節點
- JZ-056-刪除連結串列中重複的結點
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 【劍指offer】【3】輸入一個連結串列,從尾到頭列印連結串列每個節點的值。
- 力扣 - 劍指 Offer 52. 兩個連結串列的第一個公共節點力扣
- 【連結串列問題】打卡3:刪除單連結串列的中間節點
- 小影片平臺原始碼,刪除連結串列中重複的結點應該這樣做原始碼
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指 Offer 24. 反轉連結串列
- 劍指 Offer 24.反轉連結串列
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 0928面試小節:刪除有序連結串列中的重複元素面試
- 劍指Offer題解合集
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- leetcode----刪除連結串列中的節點LeetCode
- LeetCode題解(Offer22):尋找連結串列中倒數第k個節點(Python)LeetCodePython
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- LeetCode每日一題:刪除連結串列中的節點(No.237)LeetCode每日一題
- 從未排序的連結串列中刪除重複項排序
- 劍指Offer--陣列中重複的數字陣列
- 【連結串列問題】打卡2:刪除單連結串列的第 K個節點
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 3. 從尾到頭列印連結串列(劍指offer)
- 圖解帶頭節點的單連結串列的反轉操作圖解
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- L2-002 連結串列去重(複習)
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 《劍指offer》JAVA題解,LeetCode評測JavaLeetCode