牛客网---删除链表中重复的结点

在这里插入图片描述
提示:牛客网来说是不告诉你那里错了的,所以自己需要考虑到三种种情况
①首先按照正常的来写,写完以后在代码上修改添加需要补充的没有想到的条件
正常情况(相同的两个节点都在中间位置)
在这里插入图片描述
一般情况下,如果没有通过测试用例大部分没有考虑周到,对于这种单链表来说,在头和尾非常容易出现错误。
头(一开始就有相同的结点)
在这里插入图片描述
尾(尾部有相同的两个节点)
在这里插入图片描述

class Solution {
    
    
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
    
    
        if(pHead == NULL || pHead->next == NULL)
            return pHead;
        
        ListNode* prev = NULL;
        ListNode* cur = pHead;
        ListNode* next = cur->next;
        
        while(next)
        {
    
    
            //先考虑正常的写法
            if(cur->val != next->val)
            {
    
    
                //三个指针同时往后走
                prev = cur;
                cur = next;
                next = next->next;
            }
            else
            {
    
    
                //尾不正常的情况也要考虑进去
                while(next && cur->val == next->val)
                {
    
    
                    next = next->next;
                }
                //这里是考虑了头那里就是相同的情况
                if(prev !=NULL)
                {
    
    
                    prev->next = next;
                }
                else
                {
    
    
                    //此时前面的结点都删除了,所以现在的这个next就是新的头
                    pHead = next;
                }
                
                //释放那两个相同的结点
                while(cur != next)
                {
    
    
                    //如果你直接对cur释放完,他就找不到下一个了
                    ListNode* del = cur;
                    cur = cur->next;
                    free(del);
                }
                if(next != NULL)
                    next = cur->next;
            }
        }
        return pHead;
    }
};

猜你喜欢

转载自blog.csdn.net/MEANSWER/article/details/112062086
今日推荐