[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 };

 

posted @ 2017-06-14 14:50  王大咩的图书馆  阅读(273)  评论(0编辑  收藏  举报