Leetcode 82. Remove Duplicates from Sorted List II

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.

s思路:
1. 方法1:自己晕晕乎乎写的,思路很琐碎。
2. 方法1修正了一下:用两个指针pre和pnow,用dummy防止头指针修改。方法是:先做实验判断是否有duplicates,根据pnow和pnow->next是否相等,如果等,则while把所有相等的pass掉;然后比较pre->next和pnow:相等,说明pnow没有移动,没有重复,则:pre往后移动;不等,说明pnow移动过,有重复,则pre->next=pnow->next;表示:跳过pnow指向的数!
3. 这道题,设计的指针操作两个:指针移位,不修改链表;指针next修改,修改链表!
2. 方法2:参考之前写的。用pointer-to-pointer。关键是如何检测到duplicate.即:如果当前和下一个相等,则用一个while循环把相等的都给跳过,当不相等时,则直接移位!

//方法1:做得很差!
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        //
        ListNode* dummy=new ListNode(INT_MIN);
        dummy->next=head;
        //head=dummy;
        ListNode* pre=dummy,*cur=head;
        bool repeat=0;
        while(cur){
            cur=cur->next;
            if(pre->next!=cur){
                if(cur&&pre->next->val==cur->val){
                    repeat=1;   
                }else{
                    if(repeat==1){
                        pre->next=cur;
                        repeat=0;   
                    }else
                        pre=pre->next;
                }    
            }    

        }
        return dummy->next;
    }
};

//方法1:修改优化后。利用pre和pnow关系,判断是否有重复!
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        //
        ListNode* dummy=new ListNode(INT_MIN);
        dummy->next=head;
        ListNode* pre=dummy,*pnow=head;
        while(pnow){
            while(pnow->next&&pnow->val==pnow->next->val)//跳过重复的地方
                pnow=pnow->next;
            if(pnow==pre->next){//没用重复
                pre=pnow;    
            }else{//有重复
                pre->next=pnow->next;   
            }
            pnow=pnow->next;
        }
        return dummy->next;
    }
};


//方法2:p2p 太简洁了!用到两种pointer to pointer操作。即:移动指针,修改指针;修改指针指向的位置的值
class Solution {
public:
    ListNode* deleteDuplicates(ListNode* head) {
        //
        ListNode**p=&head;
        while((*p)){
            int cur=(*p)->val;
            if((*p)->next&&cur==(*p)->next->val){
                while(*p&&cur==(*p)->val)
                    *p=(*p)->next;//修改指针指向位置的值,修改链表链接关系    
            }else
                p=&((*p)->next);//移动指针,不修改链表!
        }
        return head;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值