剑指offer-删除链表中重复的节点

题目描述

 
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表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 };

 

posted @ 2018-04-06 10:32  FlyingWarrior  阅读(162)  评论(0编辑  收藏  举报