1-2-2-3-4-4-4-5要变成1-3-5
没有头节点
方法一:非递归
ListNode* deleteDuplication(ListNode* pHead)
{
if(pHead==NULL||pHead->next==NULL)
return pHead;
ListNode *pre=NULL;
ListNode *p=pHead;
ListNode *last=NULL;
while(p!=NULL)
{
if(p->next!=NULL&&p->next->val==p->val)
{
last=p->next->next;
while(last!=NULL&&last->val==p->val)//如果一直有重复
last=last->next;
//最后是cur->next不是重复节点,cur是最后一个重复节点
if(pHead==p)//头节点特殊处理
pHead=last;
else
pre->next=last;
p=last;
}
else
{
pre=p;
p=p->next;
}
}
return pHead;
}
方法二:递归法(大神级逻辑能力,我也是学来的)
ListNode* deleteDuplication(ListNode* pHead)
{
//先找出哪些节点重复
if(pHead==NULL)
return NULL;
if(pHead!=NULL&&pHead->next==NULL)
return pHead;
if(pHead->next->val==pHead->val)
{
ListNode *cur=pHead->next->next;
while(cur!=NULL&&cur->val==pHead->val)
cur=cur->next;
return deleteDuplication(cur);
}
else
{
ListNode *cur=pHead->next;
pHead->next=deleteDuplication(cur);
return pHead;
}
}