牛客(删除链表中重复节点)

题目要求:

牛客(删除链表中重复节点)_第1张图片
题目链接

方法:直接删除法

在遍历单链表的时候,检查当前节点与下一点是否为相同值,如果相同,继续查找相同值的最大长度,然后指针改变指向。

图示:
牛客(删除链表中重复节点)_第2张图片
牛客(删除链表中重复节点)_第3张图片牛客(删除链表中重复节点)_第4张图片实现代码:

class Solution {
     
public:
    ListNode* deleteDuplication(ListNode* pHead)
{
     
        //链表为空链表或者只有一个结点,直接返回头节点
        if(pHead==NULL || pHead->next==NULL)
            return pHead;
        //pre结点用来链接非重复节点
        ListNode *pre = NULL;
        ListNode *cur = pHead;
        ListNode *next = pHead->next;
        while(next)
        {
     
            //如果cur->val 和 next->val不同,pre cur next一起往后移动
            if(cur->val != next->val)
            {
     
                pre = cur;
                cur = next;
                next = next->next;
            }
            else
            {
     
                //寻找和当前cur->vsl相同的所有节点
                while(next && cur->val==next->val)
                {
     
                    next = next->next;
                }
                if(pre)
                    pre->next = next;
                else
                    //如果当前pre是NULL,将next作为头节点
                    pHead = next;
                //将重复节点释放
                while(cur!=next)
                {
     
                    ListNode *del = cur;
                    cur = cur->next;
                    free(del);
                }
            }
            if(cur)
                next = cur->next;
        }
        return pHead;
    }
};

你可能感兴趣的:(题目求解,链表)