(劍指Offer)面試題57:刪除鏈表中的重復結點


題目:

在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。

例如,鏈表1->2->3->3->4->4->5 處理后為 1->2->5

思路:

由於頭結點有可能被刪除,因此需要創建新的頭結點pNew;

遍歷鏈表,每遍歷一個結點pCur,且pCur!=NULL,做以下判斷:

如果它的下個結點不為空,且當前結點和下個結點的值相等,那么說明這兩個是重復的結點,需要繼續往下遍歷,一直找到不重復的結點為止;

否則,pNew的下個結點指向當前結點pCur,即pNew->next=pCur,pNew=pNew->next;

在線測試OJ:

http://www.nowcoder.com/books/coding-interviews/fc533c45b73a41b0b44ccba763f866ef?rp=3

AC代碼:
(沒有delete操作,容易造成內存泄露)

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
		//if(pHead==NULL || pHead->next==NULL)
        //    return pHead;
        
        ListNode* pNew= new ListNode(0);
        ListNode* pTmp=pNew;
        ListNode* pCur=pHead;
        
        while(pCur){
            if(pCur->next!=NULL && pCur->val==pCur->next->val){
                ListNode* pNext=pCur->next;
                while(pNext->next!=NULL && pNext->val==pNext->next->val)
                    pNext=pNext->next;
                pCur=pNext->next;
            }
            else{
                pTmp->next=pCur;
                pTmp=pTmp->next;
                pCur=pCur->next;
            }
        }
        
        pTmp->next=NULL;
        
        return pNew->next;
    }
};

(添加delete操作,避免內存泄露)

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
		//if(pHead==NULL || pHead->next==NULL)
        //    return pHead;
        
        ListNode* pNew= new ListNode(0);
        ListNode* pTmp=pNew;
        ListNode* pCur=pHead;
        ListNode* pDel=NULL;
        
        while(pCur){
            if(pCur->next!=NULL && pCur->val==pCur->next->val){
                pDel=pCur;
                ListNode* pNext=pCur->next;
                delete pDel;
                while(pNext->next!=NULL && pNext->val==pNext->next->val){
                    pDel=pNext;
                    pNext=pNext->next;
                    delete pDel;
                }
                pDel=pNext;
                pCur=pNext->next;
                delete pDel;
            }
            else{
                pTmp->next=pCur;
                pTmp=pTmp->next;
                pCur=pCur->next;
            }
        }
        
        pTmp->next=NULL;
        
        return pNew->next;
    }
};

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM