给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:三指针,定义一个哑结点,和左右指针,指针分别指向哑结点的下一个元素,哑结点是从头结点的前一个元素进行遍历,当左指针和右指针的值相同时,让哑结点指向右指针的下一个元素同时删除左指针和右指针中间的指针。假如没有相同的则哑结点进行后移。
/**
* 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) {
ListNode *PCUR=new ListNode(0);
ListNode *L;
ListNode *R;
PCUR->next=head;
head=PCUR;//头指针从哑结点开始
while(PCUR->next!=NULL)
{
L=PCUR->next;
R=PCUR->next;
while(R->next&&R->next->val==L->val)
R=R->next;
//判断是否有元素的值相同
if(L==R)
PCUR=PCUR->next;
else
{
PCUR->next=R->next;
while(L!=R)
{
ListNode *temp=new ListNode(0);
temp=L;
L=L->next;
delete temp;
}
delete L;
}
}
return head->next;
}
};