剑指offer(c++)——删除链表中重复的结点
2017-04-18 15:16
411 查看
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
struct ListNode { int val; struct ListNode *next; ListNode(int x) :val(x), next(NULL) {} }; /*思路:从头到尾遍历链表,如果当前结点与下一个结点值相同,它们就是重复结点,都被删除。为了保证删除之后链表没有 从中间断开,需要把当前结点的前一个结点(pPreNode)和后面不重复的第一个结点(pNext)相连。同时注意头结点有可能也会被删除*/ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if (pHead == NULL) return NULL; ListNode* pNewHead = new ListNode(-1); //申请一个新的头结点,防止原头结点重复,被删除 pNewHead->next = pHead; ListNode* pPreNode = pNewHead; //始终指向要删除结点的前一个结点 ListNode* pNode = pHead; //用来寻找要删除的结点 ListNode* pNext = NULL; //始终指向删除结点的后一个结点,防止链表断开 while (pNode != NULL&&pNode->next != NULL) { pNext = pNode->next; if (pNode->val == pNext->val) //如果有重复结点 { while (pNext != NULL&&pNext->val == pNode->val) //找到重复结点后的第一个不重复结点 pNext = pNext->next; pPreNode->next = pNext; //删除重复结点 pNode = pNext; } else { pPreNode = pNode; pNode = pNode->next; } } return pNewHead->next; } };
相关文章推荐
- 《剑指offer》面试题57 删除链表中重复的结点 C++ 实现 以及 错误总结 (指针问题)!!
- 《剑指offer》:[57]删除链表中重复的结点
- 《剑指offer》-删除链表中重复的结点
- (剑指Offer)面试题57:删除链表中的重复结点
- 剑指Offer系列-面试题57:删除链表中重复的结点
- 剑指offer(53)-删除链表中重复的结点
- 剑指offer——删除链表中重复的结点(好题!)
- [C++]链表中删除连续重复出现的结点
- C++删除单链表中值重复的结点
- 剑指offer——56.删除链表中重复的结点
- 删除排序链表中重复的结点(C++)
- 《剑指Offer》学习笔记--面试题57:删除链表中重复的结点
- [C++]链表中删除连续重复出现的结点
- 删除链表中重复的结点(剑指offer)
- 剑指offer(四十三)之删除链表中重复的结点
- 剑指offer--面试题57:删除链表中重复的结点
- 《剑指offer》:删除链表中重复的结点
- 《剑指offer》删除链表中重复的结点
- 剑指offer 删除链表中重复的结点
- 剑指offer--删除链表中重复的结点