1. 程式人生 > >刪除排序連結串列中重複的結點

刪除排序連結串列中重複的結點

題目是如此的清楚,以至於不會造成誤解。現將要點羅列如下:

  1. 連結串列為空,不必多說;

  2. 如果恰恰是頭結點與頭結點的後一個重複了,這種情況是可以發生的,那頭結點就要被刪除,另選新的結點作為頭結點。如何處理這種特殊情況,多申請一個指標就可以了。

圖1 幫助理解的例項

本題的具體實現細節,詳見程式碼: 

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(NULL == pHead) return NULL; 
        ListNode* pre = NULL, *cur = pHead;
        while(NULL != cur){
            if(NULL != cur->next && cur->val == cur->next->val){    //凡是涉及解引用,就要判空,這是職業素養!!!
                int repeat = cur->val;
                ListNode* pNext;
                while(NULL != cur && cur->val == repeat){    //通過迴圈刪除所有值為repeat的結點
                    pNext = cur->next;
                    delete cur;
                    cur = pNext;
                }
            }else{
                pre = cur;    //pre指向不重複的結點
                cur = cur->next;
            }
            
            if(NULL == pre){
                pHead = cur;
            }else{
                pre->next = cur;
            }
        }
        return pHead;
    }
};
圖2  牛客網執行結果