给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:定义一个 dummy 头结点,链接上原链表,cur 指向原链表头部
① 当前结点value != 当前结点的下一结点value。那么让pre指针来到当前结点,这样就链接了前一结点和当前结点。然后当前结点移至下一结点
② 当前结点value == 当前结点的下一结点value。那么就让 cur 一直往下走直到 当前结点value != 当前结点的下一结点value,然后此时是不能动 pre 指针的,要避免后面还有重复的,所以让 pre->next = cur->next。然后当前结点移至下一结点。
循环结束的条件结合例子即可,如[1,1]
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head || !head->next)
return head;
ListNode* dummyHead = new ListNode(-1);
dummyHead->next = head;
ListNode* cur = head;
ListNode* pre = dummyHead;
while(cur && cur->next)
{
if(cur->val == cur->next->val)
{
while(cur->next && cur->val == cur->next->val)//有重复的要一直删
cur = cur->next;
pre->next = cur->next;//去掉重复的数字
cur = cur->next;//继续比较下一个
}
else
{
pre = cur;
cur = cur->next;
}
}
return dummyHead->next;
}
};
思路2:递归。
head 后面有值而且和 head 的值相等,那么就找到不相等为止,然后对后面一个结点去递归,这样就把前面重复的给删除了。
head 后面有值但和 head 的值不等,那么就递归后面一个结点,接在 head 的后面
最后返回 head
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(!head)
return head;
if(head->next && head->val == head->next->val)
{
while(head->next&& head->val == head->next->val)//找到不相等位置
{
head = head->next;
}
return deleteDuplicates(head->next);//递归后面一个节点 看是不是还是重复
}
else//找到不相等的 说明这个值确实不重复 需要保留
{
head->next = deleteDuplicates(head->next);//保留这个值并找后面的是不是重复
}
return head;
}
};