題目:
在一個排序的鏈表中,存在重復的結點,請刪除該鏈表中重復的結點,重復的結點不保留,返回鏈表頭指針。
例如,鏈表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; } };