1. 程式人生 > >劍指offer 面試題57:刪除連結串列中的重複節點 c++

劍指offer 面試題57:刪除連結串列中的重複節點 c++

本題有兩種

第一題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->3->4->5   ( 只是去掉了重複節點)

思路:兩個指標 一前一後,若前後相等,刪掉後面的

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==nullptr) return nullptr;
        ListNode* pre=pHead;
        ListNode* p=pre->next;
        while(p!=nullptr)
        {
            if(pre->val == p->val)
            {
                pre->next = p->next;
                free(p);
                p=pre->next;
                continue;
            }
            pre=pre->next;
            p=p->next;
        }return pHead;
    }
};

第二題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5   (只要節點重複了刪除所有值一樣的節點)(注意和上面題目區別)

思路:先處理如果要刪除的是第一個節點的情況,先建一個頭結點給原來連結串列,這樣操作就統一了。三個指標,pre是當前指標前一個,p是當前指標,pnext是下一個,如果一直是p->val==pnext,那就刪掉,直到兩個 不相等

class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==nullptr ) return nullptr;
        ListNode* newhead = new ListNode(-1);
        newhead->next=pHead; 
        ListNode* pre=newhead;
        ListNode* p=pHead,*pnext =p->next;
        while(p!=nullptr &&p->next!=nullptr)
        {
            if(p->val == pnext->val)
            {
                while(pnext!=nullptr && pnext->val==p->val)
                {
                    ListNode* temp = pnext;
                    pnext=pnext->next;
                    free(temp);
                    temp=nullptr;
                }
                pre->next=pnext;
                p=pnext;
            }else{
                pre=p;
                p=p->next;
            }
            pnext=p->next;
        }return newhead->next;
    }
};