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

题目:删除链表中重复的结点

要求:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

 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 
15     }
16 };

关键点:

(1)若链表前两个节点是重复的,一定需要维护头指针,否则,无需维护头指针; 如: 2->2->3->5

(2)若链表末尾含有重复节点,一定要维护尾指针;如: 2->3->5->6->6

(3)由于不知道节点重复次数,所以对于重复节点的删除要使用 while 或者递归。

解题代码:

 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         if(pHead == nullptr)
14             return nullptr;
15 
16         ListNode* preNode = nullptr;
17         ListNode* pNode = pHead;
18         while(pNode != nullptr){
19             ListNode* pNext = pNode->next;
20             bool needDelete = false;
21             if(pNext != nullptr && pNode->val == pNext->val)// 注意:在使用节点的值之前一定要检查该节点是否存在
22                 needDelete = true;
23             // pNode节点与下一个节点不重复
24             if(!needDelete){
25                 preNode = pNode;
26                 pNode = pNext;
27             }
28             // pNode节点与下一个节点重复
29             else{
30                 int data = pNode->val;
31                 ListNode* pToBeDel = pNode;
32                 while(pToBeDel != nullptr && pToBeDel->val == data){
33                     pNext = pToBeDel->next;
34                     delete pToBeDel;
35                     pToBeDel = nullptr;
36                     pToBeDel = pNext;
37                 }
38                 // 维护指针
39                 // pNode之前的节点都含有重复
40                 if(preNode == nullptr)
41                     pHead = pNext;
42                 // pNode之前的节点有不重复的
43                 else
44                     preNode->next = pNext;
45                 // update
46                 pNode = pNext;
47             }
48         }
49         return pHead;
50     }
51 };

猜你喜欢

转载自www.cnblogs.com/iwangzhengchao/p/9862417.html