原题链接:删除链表中的重复元素
题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
思路:采用三个指针。slow指针指向第一个重复节点,fast指向最后一个重复节点,temp指向第一个重复节点的前一个节点。如果fast节点值等于slow节点值,fast向前递进,slow不变,直到fast节点的值不等于slow节点的值。此时,令temp->next=fast即可。
C++实现如下:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL||head->next==NULL)
return head;
ListNode *dummyhead=new ListNode(0);
dummyhead->next=head;
ListNode *fast=dummyhead->next;
ListNode *slow=dummyhead;
ListNode *temp=dummyhead;
fast=fast->next;
slow=slow->next;
while(fast)
{
if(fast->val==slow->val)
{
while(fast!=NULL&&fast->val==slow->val)
{
fast=fast->next;
}
slow=fast;
if(fast==NULL)
{
temp->next=slow;
}
else{
fast=fast->next;
temp->next=slow;
}
}
else
{
fast=fast->next;
slow=slow->next;
temp=temp->next;
}
}
return dummyhead->next;
}
};