劍指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");
}
相關文章
- JZ76 刪除連結串列中重複的節點
- 劍指offer面試題15 連結串列中倒數第K個結點面試題
- PHPer也刷《劍指Offer》之連結串列PHP
- 劍指offer面試16 反轉連結串列面試
- 【LeetCode】【連結串列】劍指 Offer 52. 兩個連結串列的第一個公共節點 思路解析和程式碼LeetCode
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 劍指Offer題解合集
- 劍指offer——兩個連結串列的第一個公共結點C++C++
- 0928面試小節:刪除有序連結串列中的重複元素面試
- 《劍指offer》:[37]如何得到連結串列環的入口地址
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指Offer--陣列中重複的數字陣列
- 《劍指offer》:[51]陣列中的重複數字陣列
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- Remove Duplicates from Sorted List 去除連結串列中重複值節點REM
- 劍指Offer面試題5(Java版):從尾到頭列印連結串列面試題Java
- 劍指offer-從尾到頭列印連結串列-phpPHP
- 劍指offer刷題之路--1.陣列中重複的數字陣列
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 從未排序的連結串列中刪除重複項排序
- [劍指offer] JAVA版題解(完整版)更新中。。。Java
- leetcode----刪除連結串列中的節點LeetCode
- 圖解帶頭節點的單連結串列的反轉操作圖解
- LeetCode題解(Offer22):尋找連結串列中倒數第k個節點(Python)LeetCodePython
- 演算法刪除單連結串列中重複的元素演算法
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 利用快慢指標快速得到連結串列中間節點指標
- 83. 刪除排序連結串列中的重複元素(JavaScript版)排序JavaScript
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 劍指 Offer 25. 合併兩個排序的連結串列 JavaScript實現排序JavaScript
- L2-002 連結串列去重(複習)
- Leetcode 劍指 Offer 03. 陣列中重複的數字LeetCode陣列
- 《劍指offer》JAVA題解,LeetCode評測JavaLeetCode
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題