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

在这里插入图片描述

  • 题目意思让我们删除所有重复的节点,因为要全部删除,双指针当中的前指针不能再指向待比较节点了,并且头结点可能会被删除,因此我们创建一个虚拟节点
  • 让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;
    }
};
posted @ 2020-05-28 23:28  zzcxxoo  阅读(414)  评论(0)    收藏  举报