剑指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 };