題目:
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留。
樣例1
輸入:1->2->3->3->4->4->5
輸出:1->2->5
樣例2
輸入:1->1->1->2->3
輸出:2->3
題解:
(線性掃描)O(n)
爲了防止第一個節點出現重複,我們定義一個虛擬元素dummy 指向鏈表頭節點。
然後從前往後掃描整個鏈表,每次掃描從當前節點往後掃描,掃描出元素相同的一段,如果這一段中的元素個數多於1個,則整段元素直接刪除。
C++:
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
//定義一個虛擬元素指向頭節點
ListNode* dummy = new ListNode(0);
dummy->next = pHead;
ListNode* p = dummy;
//從每個元素往後掃描,把重複的節點去掉
while(p->next){
//q指向第一個節點
ListNode* q = p->next;
//下一個節點存在,並且出現重複節點,則往後移
while(q&&p->next->val == q->val) q = q->next;
//如果沒出現重複節點,則直接指向下一個節點;否則,跳過重複的節點
if (p->next->next == q) p = p->next;
else p->next = q;
}
return dummy->next;
}
};