• 设置头节点方便处理

  • 双指针,pre指向已处理好的链表的最后一个节点,p指向当前要判断的节点

  • while循环遍历链表,停止条件是p为空或p->next为空

  • 当当前节点与下一节点相等时,while循环找到与当前节点不等的节点tmp,将pre指向tmp,当前节点更新为tmp,继续判断当前节点是否为重复节点

  • 当当前节点与下一节点不等时,pre和p同时前进一位即可

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        // write code here
        ListNode* vhead = new ListNode(-1);
        vhead->next = head;
        ListNode* p = head;
        ListNode* pre = vhead;
        while(p && p->next){
            if(p->val == p->next->val){
                ListNode* tmp = p->next;
                while(tmp && tmp->val == p->val){
                    tmp = tmp->next;
                }
                pre->next = tmp;
                p = tmp;
                
            }else{
                pre = pre->next;
                p = p->next;
            }
        }
        return vhead->next;
    }
};