82. Remove Duplicates from Sorted List II
Description
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
Example 1:
Input: 1->2->3->3->4->4->5
Output: 1->2->5
Example 2:
Input: 1->1->1->2->3
Output: 2->3
Analysis
这题比83题多了要保留对前一个节点的指针,同时在头指针前也要加一个preHead,以防止连续重复的数字出现在最开头。pre表示以验证过没有重复过的数字。除此之外就是要在cur指针移到下一次停止的地方时判断pre.next指向的元素是否就是cur,若不是,则说明出现了重复数字,cur移动了;否则就是cur未移动,此时pre可以往下移动一个数字。(表达能力堪忧啊qaq)
Code
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL || head->next==NULL)
return head;
ListNode* preHead = new ListNode(0);
preHead->next = head;
ListNode* pre = preHead;
ListNode* cur = head;
while(cur && cur->next){
while(cur->next && cur->val == cur->next->val){
cur = cur->next;
}
if(pre->next == cur){
pre = pre->next;
}
else{
pre->next = cur->next;
}
cur = cur->next;
}
return preHead->next;
}
};