《劍指offer》-刪除鏈表中重複的結點

題目描述

在一個排序的鏈表中,存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5

解法:

1.設置3個指針,一個是當前p,一個是前一個pPre,一個是後一個pNext

2.刪除的時候,主要考慮到頭結點是否重複,所以分情況討論,先設置pPre爲NULL

3.判斷是否重複,while(p != NULL && p->val==pNext->val),移動pNext

4.開始刪除結點,pPre->next = pNext,這裏需要判斷pPre是否爲空,若不爲空則執行前面;若爲空,則是頭結點也被刪除了,此時重新設置pHead=NULL

5.不用刪除結點,同理判斷pPre是否爲空(這裏面第一次肯定會執行),若爲空,則設置頭結點pHead=p,方便於重新構建鏈表;其餘,都要執行移動,pPre = p;

6.最後不管是不是刪除結點,p肯定要移動指向下一個結點,p=pNext;

總體來說,在思考的過程中,不知道如何處理頭結點也被刪除的情況,這裏比較巧妙,用了開始設置爲空來進行判斷,分爲刪除和不刪除結點兩種情況來討論。

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        ListNode* p = pHead;
        ListNode* pPre = NULL;
        ListNode* pNext = NULL;
        while(p != NULL)
        {
            bool flag = false;
            pNext = p->next;
            while(pNext != NULL && p->val == pNext->val) {
                flag = true;
                pNext = pNext->next;
            }
            if(flag) {
                if(pPre != NULL) 
                    pPre->next = pNext;
                else pHead = NULL;  //當第一個頭結點也要去除的時候
            }
            else {
                if(pPre == NULL) //新建一個結點
                    pHead = p;
                
                
                pPre = p;  //繼續移動,這裏不是esle
            }
            p = pNext; 
        }
        return pHead;
    }
};


發佈了110 篇原創文章 · 獲贊 128 · 訪問量 45萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章