劍指offer-刪除鏈表中重復的節點
阿新 • • 發佈:2018-04-06
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-刪除鏈表中重復的節點