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