刪除列表中重複的節點

題目

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