题目
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
题意
给定一个有序的链表,删除所有重复结点,仅仅留下出现过一次的结点
注意
- 根据题意知道,是删除所有的重复的结点
- 作为重复元素中第一个元素应该如何处理
- 和82. Remove Duplicates from Sorted List 203. Remove Linked List Elements的区别。
思路
1.设置三个指针pre,cur,next。pre指向cur前一个元素,next往后一位查找和cur的值是否相等,当没有相等时,pre移动到cur的位置,cur往前走一步。
2.当next往后一位找到和cur有相等的,就删除next指向的结点,并继续往后一位看和cur是否相等,相等继续删除,不等退出循环。在这个过程中需要维护好cur->next和next->next的信息。
3.继续第二步骤,当cur之后和它相等的已经删除完毕退出循环,说明cur本身是重复元素的起始元素,继续对cur进行删除,cur指向下一个不重复元素。
代码
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
ListNode *virtualNode = new ListNode(0);
virtualNode->next = head;
ListNode* cur = virtualNode->next; //这就是虚拟结点的存在的理由,从虚拟结点处当做当前结点
//判断的是当前结点的下一结点
ListNode* pre = virtualNode;
while (cur != NULL)
{
ListNode* next = cur->next;
bool flag = false; //用来处理重复元素的第一位元素
while (next != NULL)
{
if (cur->val == next->val)
{
ListNode* dele = next;
//cur和next处理的结果不可以一致
cur->next = next->next;
//cur = cur->next;
next = next->next;
delete dele;
flag = true;
}
else
{
break;
}
}
if (flag)
{
ListNode* firstdele = cur;
//有重复元素,一定要在这里处理cur,否则马上执行删除操作
cur = cur->next;
delete firstdele;
pre->next = cur;
continue;
}
else
{
//当没有重复元素的时候,pre指向当前的cur的结点
//而cur马上需要更新到下一结点
pre = cur;
}
cur = cur->next;
}
ListNode* retNode = virtualNode->next;
delete virtualNode;
return retNode;
}
};