删除链表中所有重复的节点

- 题目意思让我们删除所有重复的节点,因为要全部删除,双指针当中的前指针不能再指向待比较节点了,并且头结点可能会被删除,因此我们创建一个虚拟节点
- 让p指向dummy,q=p-next,作为工作指针,找到第一个与p-next值不相同的节点,此时分两种情况
- p,q中间间隔一个节点
(即该段没有重复节点),说明下一个节点不用删除,此时让p指向下一个节点- p,q间隔超过一个节点,此时将
p->next=q删除多余节点
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
auto dummy =new ListNode(0);
dummy->next=head;
auto p=dummy;
while(p->next){
auto q=p->next;
while(q && q->val==p->next->val)q=q->next;
if(p->next->next==q)p=p->next; //中间间隔是一个节点
else p->next=q; //有多余节点,删除
}
return dummy->next;
}
};

浙公网安备 33010602011771号