一、题目
删除链表中重复的节点:在一个排序的链表中,如何删除重复的结点?例如,在图(a)中重复 结点被删除之后,链表如图3.4(b)所示。
(a). 1->2->3->3->4->4->5
(b). 1->2->5
二、解法
#include <iostream>
using namespace std;
struct ListNode
{
int val;
struct ListNode *next;
ListNode(int x = 0)
:
val(x), next(NULL) {
}
};
class Solution
{
public:
ListNode * deleteDuplication(ListNode* pHead)
{
//设置一个trick, 作为头指针, 这样我们无需单独考虑第一个元素
ListNode *first = new ListNode(-1);
first->next = pHead;
ListNode *p = pHead;
ListNode *last = first;
while (p != NULL && p->next != NULL)
{
// 如果有元素重复
if (p->val == p->next->val)
{
// 就跳过所有重复的数字
int val = p->val;
while (p != NULL && p->val == val)
{
p = p->next;
}
// 此时p指向了非重复的第一个元素
// 我们设置last->next = p
// 但是此时p-val也可能是重复的,
// 因此我们不可以设置last = p
// 而是重新进入循环
last->next = p;
}
else
{
last = p;
p = p->next;
}
}
return first->next;
}
};
int main()
{
Solution solu;
ListNode list[7];
list[0].val = 1;
list[0].next = &list[1];
list[1].val = 2;
list[1].next = &list[2];
list[2].val = 3;
list[2].next = &list[3];
list[3].val = 3;
list[3].next = &list[4];
list[4].val = 4;
list[4].next = &list[5];
list[5].val = 4;
list[5].next = &list[6];
list[6].val = 5;
list[6].next = NULL;
ListNode *node = solu.deleteDuplication(list);
while (node != NULL)
{
cout << node->val << " -=> ";
node = node->next;
}
system("pause");
return 0;
}