1. 程式人生 > >劍指offer-刪除鏈表中重復的節點

劍指offer-刪除鏈表中重復的節點

nbsp eno cat off span scribe 每次 amp tom

題目描述

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

解題思路

定義preNode指向當前結點pNode的前一個節點,每次訪問pNode時首先判斷它與後面節點是否重復,若重復則置bool型變量needDel為true。不需要刪除時preNode和pNode分別指向下一個節點;需要刪除時,首先保存pNode指向的結點值,依次向後遍歷並刪除每一個重復節點,直到找到第一個不重復的節點用pNext指向它。然後判斷preNode是否為NULL,若為空說明當前重復節點是從首節點開始的,則直接把頭指針pHead指向pNext;若不為空,則用preNode的next指針指向pNext。最後把當前結點pNode指向pNext即可。

代碼

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6         val(x), next(NULL) {
 7     }
 8 };
 9 */
10 class Solution {
11 public:
12     ListNode* deleteDuplication(ListNode* pHead)
13     {
14         ListNode* preNode = NULL;
15         ListNode* pNode = pHead;
16 while(pNode){ 17 ListNode* pNext = pNode->next; 18 bool needDel = false; 19 if(pNext&&pNext->val == pNode->val) 20 needDel = true; 21 if(!needDel){ 22 preNode = pNode; 23 pNode = pNode->next;
24 } 25 else{ 26 int val = pNode->val; 27 ListNode* pDel = pNode; 28 while(pDel&&pDel->val == val){ 29 pNext = pDel->next; 30 delete pDel; 31 pDel = pNext; 32 } 33 if(preNode == NULL) 34 pHead = pNext; 35 else 36 preNode->next = pNext; 37 pNode = pNext; 38 } 39 } 40 return pHead; 41 } 42 };

劍指offer-刪除鏈表中重復的節點