zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    3、第3课CSS块级、行内元素、绝对定位、相对定位、固定位置20150922
    Easyui 正则表达式
    struts 标签
    源码详解Java的反射机制
    MyEclipse8.6安装 spket 插件
    有些路,只能一个人走
    HG8245获取超级管理员(telecomadmin)密码的方法
    easyui doc
    oracle建立自动增长字段
    Java实现二维码QRCode的编码和解码
  • 原文地址:https://www.cnblogs.com/love-yh/p/7008843.html
Copyright © 2011-2022 走看看