一:题目描述
在一个排序的链表中,如何删除重复的结点?
如 1->2->3->3->4->4->5
删除重复的结点后链表变成:
1->2->5
二:解题思路
如果当前节点的值与下一个结点的值相同,那么他们就是重复的结点,都可以被删除。
为了保证删除后链表仍然是相连的没有断开,我们要把当前节点的前一个节点和侯敏值比他大的结点相连。、
需要注意:
1.输入空链表
2.删除的结点可能是头结点
3.删除后链表可能为空。
三:代码实现
ListNode* deleteRepeatNode(ListNode * head){ if (head == NULL) return NULL; ListNode* deletedHead = head; ListNode* pPreNode = NULL; ListNode* pNode = head; while (pNode != NULL){ ListNode* pNext = pNode->next; bool needDelete = false; if (pNext != NULL && pNext->val == pNode->val) needDelete = true; if (!needDelete){ pPreNode = pNode; pNode = pNode->next; } else{ int val = pNode->val; ListNode* pToBeDel = pNode; while (pToBeDel != NULL && pToBeDel->val == val){ pNext = pToBeDel->next; //删除指针空间,并将指针置为NULL,防止野指针现象 delete pToBeDel; pToBeDel = NULL; pToBeDel = pNext; } //原始头结点被删除 if (pPreNode == NULL) deletedHead = pNext; else pPreNode->next = pNext; pNode = pNext; }//else }//while return deletedHead; }