1. 程式人生 > 其它 >[AcWing 29] 刪除連結串列中重複的節點

[AcWing 29] 刪除連結串列中重複的節點


點選檢視程式碼
/**
 * 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;
    }
};

  1. 使用虛擬頭結點便於處理頭結點的各種情況;
  2. 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 此時指向的是一個新的結點,再判斷此結點是否重複;