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.
For example,
Given 1->2->3->3->4->4->5, return 1->2->5.
Given 1->1->1->2->3, return 2->3.
思路:在前一个问题中只有将重复的元素只保留一份就可以了。本题要求在遍历一个链表的时候如果有某个元素出现了重复,则在链表中删除这个元素。
注意: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==NULL||head->next==NULL)
return head;
//注意head也是可能被删除的,可以使用一个辅助的头节点
ListNode *res = new ListNode(0);
res->next=head;
ListNode *pre=res,*cur=head;
bool isdup=false;
while(cur->next)
{
if(cur->val==cur->next->val)
{
ListNode *p=cur->next;
cur->next=p->next;
delete p;
isdup=true;
}
else if(isdup) //说明之前的元素出现了重复,需要在链表中删除
{
pre->next=cur->next;
delete cur;
cur=pre->next;
isdup=false;
}
else
{
pre=cur;
cur=cur->next;
}
}
if(isdup)
{
pre->next=NULL;
delete cur;
}
return res->next;
}
};