劍指offer——29、刪除鏈表中重複的節點

題目:

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留。
樣例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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章