删除链表中重复的结点

89 阅读1分钟

删除链表中重复的结点_牛客题霸_牛客网 (nowcoder.com)

class Solution {
public:
    ListNode* deleteDuplication(ListNode* head) {
        auto dummy = new ListNode(-1); //建立虚拟头结点
        dummy->next = head;//虚拟头结点指向头结点
        auto p = dummy; 

        while(p->next) //p的下一个节点不为空 为空就是构建好了可以退出
        {    //一次循环处理一段重复节点区段(注意是按区段处理)
            auto q = p->next; //q为当前p的下一个节点
            //q的下一个节点不为空,且 q的下一个节点的值等于p的下一个节点的值 说明重复 一直走到下一个区段就行啦
            while(q->next && q->next->val == p->next->val) q= q->next;
            //如果qp的下一个节点 说明就没有走上面的while循环, 也就是这个点是不重复的,p移动到q
            if(q == p->next) p = q;
            //如果不是说明存在重复元素,则p指向q的下一个节点 即后面要处理下一区段
            else p->next = q->next;

        }
        return dummy->next;
        }
};