• [Leetcode] Remove duplicate 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,
    Given1->2->3->3->4->4->5, return1->2->5.
    Given1->1->1->2->3, return2->3.

    这题和Remove duplicate from sorted list的区别在于,本题中,只要结点只要出现重复则该值相等的结点都要删除,上题中留一个不删。

    思路:这里有可能有修改表头(如:1->1->1>2>3),一般修改表头的题目都会需要一个辅助指针,所以要新建一个结点。遍历链表,遇到相等的相邻结点,直接继续遍历;遇到不相等的两相邻结点时,若pre->next=cur说明cur没有重复的,pre=pre->next即可,若是不等于说明,可能有重复,则,pre连接cur但是pre不移动,需重新进入循环检验是否没有重复(没有重复时,pre->next=cur),直到没有重复结点。源代码

     主要的思想是:保持前指针pre不动,因为pre没有重复,所以用其next去和后面的比较。当遇到值不相等时,判断中间是否有重复,即pre->next=cur(这里判断cur是否为pre的后缀,不是值的判断),没有,pre移动,有,则pre不动,但和后面的连接起来,继续重复。

     1 class Solution {
     2 public:
     3     ListNode *deleteDuplicates(ListNode *head) 
     4     {
     5         if(head==NULL)  return head;
     6 
     7         ListNode *newList=new ListNode(-1);
     8         newList->next=head;
     9         ListNode *pre=newList;
    10         ListNode *cur=head;
    11 
    12         while(cur)
    13         {
    14             while(cur->next&&pre->next->val==cur->next->val)
    15             {
    16                 cur=cur->next;
    17             }
    18 
    19             if(pre->next==cur)    //想明白!不是值。
    20                 pre=pre->next;
    21             else
    22             {
    23                 pre->next=cur->next;
    24             }
    25 
    26             cur=cur->next;
    27         }
    28         return newList->next;
    29     }
    30 };
  • 相关阅读:
    如何查看哪些软件或进程占用了网速
    关于str.split(",")中间 什么时候该加\转义
    【转】servlet/filter/listener/interceptor区别与联系
    专题-Delphi/C++ Builder多线程编程与调试
    Android点击图标重新启动问题
    用PHP判断远程图片(文件)是否存在
    php获取目录中的所有文件名
    PHP读取一个目录下的文件个数
    2>&1 的用法说明
    【PHP操作sphinx】
  • 原文地址:https://www.cnblogs.com/love-yh/p/7008843.html
Copyright © 2020-2023  润新知