zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

删除链表中重复的结点


题目描述

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

解题思路

处理链表重复问题,一般使用三个指针:pPre\pCur\pNext分别指向当前结点的前一个结点,当前结点,当前结点的后一个结点。

具体思想请看代码部分。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
struct ListNode
{
int val;
struct ListNode *next;
ListNode (int x): val(x), next(NULL) {}
};
class Solution
{
public:
ListNode* deleteDuplication (ListNode* pHead)
{
if (pHead == NULL)
return NULL;

ListNode* pPre = NULL;
ListNode* pCur = pHead;
ListNode* pNext = NULL;

while (pCur != NULL)
{
if (pCur->next != NULL && pCur->val == pCur->next->val)
{
pNext = pCur->next;
// 跳出循环的pNext就是重复的最后一个结点
while (pNext->next != NULL && pCur->val == pNext->next->val)
{
pNext = pNext->next;
}
if (pCur == pHead)
{
pHead = pNext->next;
}
else
pPre->next = pNext->next;
pCur = pNext->next;
}
else
{
pPre = pCur;
pCur = pCur->next;
}
}
return pHead;
}
};

参考链接:https://cuijiahua.com/blog/2018/01/basis_56.html

文章作者:zerofly

发布时间:2020年06月06日 - 11:06

原始链接:http://zeroflycui.github.io/348f314f.html

许可协议: 转载请保留原文链接及作者。