題目
在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5
思路
在鏈表的頭節點前面再插入一個節點(保證節點的值和頭結點的值不一樣),pre指針初始指向新的頭結點,用一個p和next指針來進行遍歷,初始p指向原來的頭節點,然後每次讓next指向p的next指針,比較它們的值是否一樣,如果不一樣就把pre指向當前的p,並且p往後移一位,如果它們的值一樣的話,就把next指針繼續往後掃描一直到next爲空或者next的值不等於當前p的值爲止,這個時候把pre的next的指針就指向next,並且把p指向next。
參考代碼
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
class Solution
{
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (!pHead || pHead->next == nullptr) return pHead;
ListNode* newHead = new ListNode(pHead->val + 1);
newHead->next = pHead;
ListNode* pre = newHead;
ListNode* p = pHead;
ListNode* next = nullptr;
while (p && p->next)
{
next = p->next;
if (p->val == next->val)
{
while (next && next->val == p->val)
{
next = next->next;
}
pre->next = next;
p = next;
}
else
{
pre = p;
p = p->next;
}
}
return newHead->next;
}
};