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

Posted FlyingWarrior

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 };

 

以上是关于剑指offer-删除链表中重复的节点的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer(链表)-删除链表中重复的节点

剑指offer18删除链表的(重复)节点

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

剑指offer链表题的双指针法总结

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

剑指offer-18-2. 删除链表中重复的结点