LeetCode 82. Remove Duplicates from Sorted List II pre指针,首元素的处理

题目

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.

For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.

题意

给定一个有序的链表,删除所有重复结点,仅仅留下出现过一次的结点

注意

思路

1.设置三个指针pre,cur,next。pre指向cur前一个元素,next往后一位查找和cur的值是否相等,当没有相等时,pre移动到cur的位置,cur往前走一步。
2.当next往后一位找到和cur有相等的,就删除next指向的结点,并继续往后一位看和cur是否相等,相等继续删除,不等退出循环。在这个过程中需要维护好cur->next和next->next的信息。
3.继续第二步骤,当cur之后和它相等的已经删除完毕退出循环,说明cur本身是重复元素的起始元素,继续对cur进行删除,cur指向下一个不重复元素。

代码

class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        ListNode *virtualNode = new ListNode(0);
        virtualNode->next = head;   

        ListNode* cur = virtualNode->next;  //这就是虚拟结点的存在的理由,从虚拟结点处当做当前结点
        //判断的是当前结点的下一结点
        ListNode* pre = virtualNode;
        while (cur != NULL)
        {
            ListNode* next = cur->next;
            bool flag = false;   //用来处理重复元素的第一位元素
            while (next != NULL)
            {
                if (cur->val == next->val)
                {
                    ListNode* dele = next;
                    //cur和next处理的结果不可以一致
                    cur->next = next->next;
                    //cur = cur->next;
                    next = next->next;
                    delete dele;
                    flag = true;
                }
                else
                {
                    break;
                }
            }
            if (flag)
            {                    
                ListNode* firstdele = cur;
                //有重复元素,一定要在这里处理cur,否则马上执行删除操作
                cur = cur->next;
                delete firstdele;
                pre->next = cur;
                continue;
            }
            else
            {
                //当没有重复元素的时候,pre指向当前的cur的结点
                //而cur马上需要更新到下一结点
                pre = cur;
            }
            cur = cur->next;
        }

        ListNode* retNode = virtualNode->next;
        delete virtualNode;

        return retNode;
    }
};

结果

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值