C/C++教程

牛客网-NC24 删除有序链表中重复的元素-II

本文主要是介绍牛客网-NC24 删除有序链表中重复的元素-II,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、题目

在这里插入图片描述

二、思路

方法一:用map容器储存每个值,然后遍历map容器,新建值为1的节点
方法二、双指针

  • 首先创建一个新节点,新节点指向head,并且定义两个节点,当前节点和前节点

  • while循环,当前节点和它的下一个节点不为空。两种情况

    • 当前节点和下一个节点相等,遍历找到第一个不相等的,然后pre指向这个第一个不相等的节点
    • 当前节点和下一个节点相等,pre=当前节点,当前节点=下一个节点

三、代码

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* deleteDuplicates(ListNode* head) {
        if(head==nullptr || head->next==nullptr)
        {
            return head;
        }
        
        //定义头结点,使判断从第一个开始
        ListNode *node=new ListNode(-1);
        node->next=head;
        
        //定义两个节点
        ListNode *pre=node;
        ListNode *cur=head;
        
        //当前节点和当前节点的下一个节点不为空
        while(cur && cur->next)
        {
            //如果下一个节点和当前节点相同
            if(cur->val==cur->next->val)
            {
                //找到第一个不相等的,即为cur->next
                while(cur->next && cur->val==cur->next->val)
                {
                    cur=cur->next;
                }
                //pre节点指向第一个不相等的
                pre->next=cur->next;
                //当前节点指向不相等的第一个
                cur=cur->next;
            }
            else
            {
                //pre等于当前节点
                pre=cur;
                //当前节点等于下一个
                cur=cur->next;
            }
        }
        return node->next;
    }
};
这篇关于牛客网-NC24 删除有序链表中重复的元素-II的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!