【力扣】移除链表元素203

目录

  • 1.前言
  • 2. 题目描述
  • 3. 题目分析
    • 3.1 不带哨兵位
    • 3.2 带哨兵位
  • 4. 附代码
    • 4.1 不带哨兵位
    • 4.2 带哨兵位

1.前言

这里开始介绍从网上一些刷题网站上的题目,在这里做一些分享,和学习记录。
先来介绍一些力扣的OJ题目。
这里的OJ就是我们不需要写主函数,力扣会提供一个接口,在力扣中会调用我们所写的代码和它后台的匹配,从而判断我们写的代码正确性。

在力扣的题目中一般会给一些示例,就像这样:
在这里插入图片描述
当我们写完代码时可以点击运行,这时下面会出现一些测试用例,就像下面这样:
在这里插入图片描述
但是并不是给了运行成功就一定能成功,必须点击上面的提交,通过了才是真正的正确,就像下面这样:
在这里插入图片描述

2. 题目描述

在这里插入图片描述

3. 题目分析

这里题目明确指出需要返回的是新的链表,所以要返回一个新链表的头节点。
当我们没有任何思路时,可以先看看它给的示例,先进行一下分析。
在这里插入图片描述
要找到不是val值的节点,那么首先肯定要先遍历原来的链表,把不是的插入到新的链表中。

那首先就得先定义一个新的链表的头指针struct ListNode* newhead=NULL;为了方便实现插入,使用尾插,再定义一个新链表的尾指针方便插入struct ListNode* tail=NULL;接下来就需要原链表中找出不是val值的节点,然后尾插就行。

怎么找出不是val值的节点?
为了不使原链表中的头节点丢失,用定义一个cur指针代替,struct ListNode* cur=head;
用一个while循环,当cur为空时就结束,也就是cur已经把原链表遍历完了。

这里需要先考虑一下如果原链表为空,那就直接返回NULL就行。

在循环中怎么写找到val的代码?
那就先让cur往后走,当走到cur->val=val结束,所以这里插入的条件就是if(cur->val!=val),然后开始实现尾插。

3.1 不带哨兵位

这里还需要先判断一下新的链表是不是为空,如果为空,那就直接将cur=newhead,并且更新一下tail=cur;如果不为空,那就直接实现尾插。

        if(cur->val!=val)
        {
            if(newhead==NULL)
            {
                newhead=cur;
                tail=cur;
            }
            else
            {
                 tail->next=cur;
                 tail=tail->next;
            }

然后让cur继续往后遍历。
当找到原链表中节点值为val的节点是时,就删除:

struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);

这里加一个尾指针的判断

if(tail)
    {
        tail->next=NULL;
    }

最后直接返回新节点的头指针。
在这里插入图片描述

3.2 带哨兵位

使用带哨兵位的新链表, newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));就不需要判断新链表是否为空。
其它地方都与不带哨兵位一样,不过最后得把申请的哨兵位释放掉,返回的是哨兵位的后一个节点。

     struct ListNode* tmp=newhead;
     newhead=newhead->next;
     free(tmp);

    return newhead;  

在这里插入图片描述

4. 附代码

4.1 不带哨兵位


struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    struct ListNode* cur=head;
    while(cur)
    {
        if(cur->val!=val)
        {
            if(newhead==NULL)
            {
                newhead=cur;
                tail=cur;
            }
            else
            {
                 tail->next=cur;
                 tail=tail->next;
            }
         cur=cur->next;
        }
        else{
         struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);
        }
        
    }
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;    
}

4.2 带哨兵位


struct ListNode* removeElements(struct ListNode* head, int val) {
   
    struct ListNode* newhead=NULL;
    struct ListNode* tail=NULL;
    struct ListNode* cur=head;

    newhead=tail=(struct ListNode*)malloc(sizeof(struct ListNode));

    while(cur)
    {
        if(cur->val!=val)
        {
             tail->next=cur;
             tail=tail->next;
             cur=cur->next;
        }
        else{
         struct ListNode* tmp=cur;
         cur=cur->next;
         free(tmp);
        }
        
    }
     tail->next=NULL;
    
     struct ListNode* tmp=newhead;
     newhead=newhead->next;
     free(tmp);

    return newhead;   
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/232062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python交互界面】实现动态观察图像在给定HSV范围的区域显示

HSV颜色空间 与RGB颜色空间相比,HSV颜色空间更适合进行颜色分析和提取特定颜色的目标。在HSV空间中,颜色信息被分布在不同的通道上,使我们能够更准确地定义颜色的范围,并使用阈值操作轻松地分离出我们感兴趣的区域部分。 HSV三个通…

魔改ESXI 8.0驱动,支持Intel I219V (22)网卡(8086:0DC8)(无需改网卡ROM)

艰难的安装 最近用铭瑄H610-itx攒了一台nas,想着兼容性高一些专门买了H610的双网卡版本,一张是螃蟹的8125BG,一张是intel的i219V,还以为esxi总不能一个网卡都认不出来吧,然而装好机启动esxi8.0的安装程序一看&#xf…

智能优化算法应用:基于灰狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于灰狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于灰狼算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.灰狼算法4.实验参数设定5.算法结果6.参考文献7.MA…

class_2:Java概念 java se ee me jdk jre jvm

一、什么是Java? Java是一门面向对象的编程语言,不仅吸收了C语言的各种优点,还摒弃了C里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地…

常见的消息中间件看这一篇就够了

浅谈消息队列及常见的消息中间件 前言 消息队列 已经逐渐成为企业应用系统 内部通信 的核心手段。它具有 低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。 当前使用较多的 消息队列 有 RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMQ 等,而部…

课堂练习3.4:进程的切换

3-9 课堂练习3.4:进程的切换 进程切换是支持多进程的一个关键环节,涉及到 CPU 现场的保存和恢复,本实训分析 Linux 0.11 的进程切换过程。 第1关第一次进程切换过程分析 任务描述 本关任务回答问题: 在第一次进程切换时: 1.是从几号进程切换到几号进程?0 号进程和 1 号…

【漏洞复现】华脉智联指挥调度平台/xml_edit/fileread.php文件读取漏洞

Nx01 产品简介 深圳市华脉智联科技有限公司,融合通信系统将公网集群系统、专网宽带集群系统、不同制式、不同频段的短波/超短波对讲、模拟/数字集群系统、办公电话系统、广播系统、集群单兵视频、视频监控系统、视频会议系统等融为一体,集成了专业的有线…

如何用Python编写俄罗斯方块Tetris游戏?

在本文中,我们将用Python代码构建一个令人惊叹的项目:俄罗斯方块游戏。在这个项目中,我们将使用pygame库来构建游戏。要创建此项目,请确保您的系统中安装了最新版本的Python。让我们开始吧! Pygame是一组跨平台的Pyth…

银河麒麟本地软件源配置方法

软件源介绍 软件源可以理解为软件仓库,当需要安装软件时则会根据源配置去相应的软件源下载软件包,此方法的优点是可以自动解决软件包的依赖关系。常见的软件源有光盘源、硬盘源、FTP源、HTTP源,本文档主要介绍本地软件源的配置方法&#xff…

通过仿真理解完整的阵列信号噪声模型

概要 噪声对无线电设备的信号接收会造成影响,是通信、雷达、导航、遥感等工程应用领域中的关键考虑因素。通常认为阵列合成能够提升信噪比,但忽略了这一论断的前提,即不同通道引入的噪声互不相关。但实际应用中,接收的噪声不仅仅包含信道引入的不相关噪声,还包含从外界环…

信息化,数字化,智能化三者是同一概念么?

引言 在当今科技和商业领域,信息化、数字化和智能化是三个极为关键的概念。信息化强调信息的获取、传递和应用,数字化则是将物理实体转化为数字形式,而智能化则赋予系统更高级的智能和自主性。这些概念的交汇与融合塑造着我们的现实&#xf…

【STM32】TIM定时器基本定时功能

第一部分:定时器基本定时的功能; 第二部分:定时器的输出比较功能; 第三部分:定时器输入捕获的功能; 第四部分:定时器的编码接口。 1 TIM简介 TIM(Timer)定时器&#…

【LeetCode刷题】数组篇2

🎇数组中等题Part 🌈 开启LeetCode刷题之旅 🌈 文章目录 🎇数组中等题Part🍰229.多数元素II👑思路分析1.哈希表法2.摩尔投票法(进阶) 🍰15.三数之和👑思路分析1.排序双指针 &#x…

PyCharm编辑器结合Black插件,轻松实现Python代码格式化

大家好,使用Black对Python代码进行格式化,可使代码看起来更美观。但是,随着项目规模不断变大,对每个文件运行Black变得很繁琐。本文就来介绍在PyCharm中实现这一目标的方法。 1.安装Black 首先,在虚拟环境中安装Blac…

【学习笔记】lyndon分解

摘抄自quack的ppt。 这部分和 s a sa sa的关联比较大,可以加深对 s a sa sa的理解。 Part 1 如果字符串 s s s的字典序在 s s s以及 s s s的所有后缀中是最小的,则称 s s s是一个 lyndon \text{lyndon} lyndon串。 lyndon \text{lyndon} lyndon分解&a…

了解应用层的HTTP协议与HTTPS协议,在常规请求的应用中Get与Post的区别

一、HTTP协议 1、http协议的特性2、http协议的请求 请求行 GET请求POST 请求(人脸识别方案)两个请求的区别本质区别: (1)url 携带的参数是否可见:(2)参数传递方式(3)缓存性&#xf…

MongoDB中的$type操作符和limit与skip方法

本文主要介绍MongoDB中的$type操作符和limit与skip方法。 目录 MongoDB的$type操作符MongoDB的limit方法MongoDB的skip方法 MongoDB的$type操作符 MongoDB中的$type操作符用于检查一个字段的类型是否与指定的类型相匹配。它可以用于查询和投影操作。 $type操作符可以与以下数…

【SpringBoot】解析Springboot事件机制,事件发布和监听

解析Springboot事件机制,事件发布和监听 一、Spring的事件是什么二、使用步骤2.1 依赖处理2.2 定义事件实体类2.3 定义事件监听类2.4 事件发布 三、异步调用3.1 启用异步调用3.2 监听器方法上添加 Async 注解 一、Spring的事件是什么 Spring的事件监听(…

【五分钟】学会利用cv2.resize()函数实现图像缩放

引言 在numpy知识库:深入理解numpy.resize函数和数组的resize方法中,小编较为详细地探讨了numpy的resize函数背后的机理。从结果来看,numpy.resize函数并不适合对图像进行缩放操作。而opencv中的resize函数虽然和numpy的resize函数同名&…

html实现动漫视频网站模板源码

文章目录 1.视频设计来源1.1 主界面1.2 动漫、电视剧、电影视频界面1.3 播放视频界面1.4 娱乐前线新闻界面1.5 关于我们界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/detail…