题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
时间限制:1秒 空间限制:32768K 热度指数:247898
本题知识点: 链表
思路
见代码注释
class Solution {
public:
ListNode* deleteDuplication(ListNode* ph)
{//1.为空,或者只有一个结点的情况
if(ph==NULL||ph->next==NULL)
return ph;
//2.2个以上结点的情况
while(ph!=NULL&&ph->next!=NULL&&ph->next->val==ph->val)
{//去除前几个重复结点
while(ph->next!=NULL&&ph->next->val==ph->val)
{ //删除除了第一个结点之后的重复结点
ListNode* a=ph;
ph=ph->next;
delete a;
}
//删除第一个结点
ListNode* a=ph;
ph=ph->next;
delete a;
}
//删除完重复头结点后,要判断剩余的是否大于2个
if(ph==NULL||ph->next==NULL)
return ph;
ListNode* t=ph->next;
ListNode* last=ph;
bool flag=false;//判断是否出现重复情况,若重复则置为true
//2 头结点跟下一个结点值不一样
while(t->next!=NULL)
{//若下一个结点值与当前节点相同,删除
if(t->next->val==t->val)
{
flag=true;
ListNode* a=t->next;
t->next=a->next;
delete a;
}
else
{//不同,则判断是否需要删除当前结点
if(flag)
{//删除,且flag还原
last->next=t->next;
ListNode* a=t;
t=t->next;
delete a;
flag=false;
}
else
{//不删除当前结点
t=t->next;
last=last->next;
}
}
}
if(flag)
{//若最后一个重复,最后一个的第一个结点还没删除
last->next=t->next;
ListNode* a=t;
t=t->next;
delete a;
flag=false;
}
return ph;
}
};