題目描述:與83題不同的是若一個元素出現(xiàn)重復(fù)則將此元素全部刪除谱邪,返回處理后的鏈表。如:
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
分析:設(shè)兩個指針庶诡,第一個指向不重復(fù)的最后一個元素惦银,第二個一邊遍歷鏈表,一邊刪除重復(fù)元素末誓。雖然是兩重while扯俱,但總共只遍歷一遍,時間復(fù)雜度O(n)喇澡,空間O(1)迅栅。
代碼:
/**
* 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) return head;
ListNode l(INT_MIN);
l.next = head;
ListNode *pre = &l, *cur = head;
while (cur) //遍歷鏈表
{
bool f = false;
while ( cur -> next && cur -> val == cur -> next -> val) //從當(dāng)前訪問的元素找重復(fù)的長度
{
f = true;
ListNode *tmp = cur;
cur = cur -> next;
delete tmp;
}
if (f) //刪除重復(fù)的最后一個元素
{
ListNode *tmp = cur;
cur = cur -> next;
delete tmp;
continue;
}
pre -> next = cur; //重新鏈到前段
pre = pre -> next;
cur = cur -> next;
}
pre -> next = cur;
return l.next;
}
};