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