删除链表的重复节点

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;     
        }
    }

猜你喜欢

转载自blog.csdn.net/kellen_f/article/details/79127470
今日推荐