[AcWing 29] 刪除連結串列中重複的節點
阿新 • • 發佈:2022-04-22
點選檢視程式碼
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* deleteDuplication(ListNode* head) { auto dummy = new ListNode(-1); dummy->next = head; auto p = dummy; while (p->next) { auto 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; } };
- 使用虛擬頭結點便於處理頭結點的各種情況;
- p 指向新連結串列的尾結點,q 指向 p 的下一個結點,while(q && p->next->val == q->val) 至少會執行一次(因為 q = p->next),下面分兩種情況討論:
① 若 p->next 結點是不重複的結點,即 p->next->next == q,則把 p 後移一位,把 p->next 加到新連結串列中;
② 若 p->next 結點是重複的結點,則此時 q 指向的是 q->val != p->next->val 的第一個結點(q 有可能和 q 後面的重複),此時執行 p->next = q,跳過剛剛重複的那段,p->next 此時指向的是一個新的結點,再判斷此結點是否重複;