劍指Offer-56.刪除鏈表中重複的結點(C++/Java)

題目:

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

分析:

遞歸思路,若是當前結點和它的next結點的val值不一樣,則當前結點能夠直接接到已處理完的結點後,繼續刪除重複的過程;若是當前結點和它的next結點的val值相同,則須要繼續遍歷,直到找到一個與當前結點val不一樣的結點做爲新鏈表的頭結點,若是找不到,說明鏈表全部結點元素都同樣,新鏈表爲NULL,不然重新的頭結點出發,繼續刪除重複的過程。指針

非遞歸思路,新建一個虛擬頭結點,若當前結點和它的next結點的val值不一樣,意味着不是重複結點,能夠加入到已處理完的結點後,若相同,須要找到一個與當前結點不一樣的結點,再從新判斷。注意遍歷結束後要把最後的當前結點加入處處理完結點以後。code

程序:

C++blog

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        if(pHead->val != pHead->next->val){
            pHead->next = deleteDuplication(pHead->next);
            return pHead;
        }
        else{
            ListNode* p = pHead;
            while(p != nullptr && p->val == pHead->val)
                p = p->next;
            return deleteDuplication(p);
        }
    }
};
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead == nullptr || pHead->next == nullptr)
            return pHead;
        ListNode* dummyHead = new ListNode(0);
        ListNode* p = dummyHead;
        ListNode* curr = pHead;
        while(curr != nullptr && curr->next != nullptr){
            if(curr->val != curr->next->val){
                p->next = curr;
                p = p->next;
            }
            else{
                while(curr->next != nullptr && curr->val == curr->next->val)
                    curr = curr->next;
            }
            curr = curr->next;
        }
        p->next = curr;
        return dummyHead->next;
    }
};

Java排序

public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
        if(pHead == null || pHead.next == null)
            return pHead;
        if(pHead.val != pHead.next.val){
            pHead.next = deleteDuplication(pHead.next);
            return pHead;
        }
        else{
            ListNode p =  pHead;
            while(p != null && p.val == pHead.val)
                p = p.next;
            return deleteDuplication(p);
        }
    }
}
相關文章
相關標籤/搜索