移除链表元素(C语言)———链表经典算法题

题目描述:203. 移除链表元素 - 力扣(LeetCode)

答案展示:

答1(遍历删除):

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val)
{typedef struct ListNode LN;LN* new_head = (LN*)malloc(sizeof(LN));new_head->next = head;   LN* new_tail = new_head;while(new_tail->next){if(new_tail->next->val==val)new_tail->next = new_tail->next->next;elsenew_tail = new_tail->next;}return new_head->next;
}

答2(遍历添加):

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val)
{typedef struct ListNode LN;LN* new_head = (LN*)malloc(sizeof(LN));new_head->next = NULL;LN* pcur2 = new_head;LN* pcur1 = head;if(!head){return NULL;}while(pcur1&&pcur1->next){if(pcur1->val!=val){pcur2->next = pcur1;pcur2 = pcur2->next;}pcur1 = pcur1->next;}pcur2->next = pcur1->val==val?NULL: pcur1;return new_head->next;
}

答3(递归):

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeElements(struct ListNode* head, int val)
{if(!head){return NULL;}else{struct ListNode* new_head = head;if(head->val==val)new_head = removeElements(head->next, val);elsenew_head->next = removeElements(head->next, val);return new_head;}
}

思路分享:

这道题一共有三种思路,可以使用遍历一遍链表,将值为val的节点删除,也可以重新创建一个头节点,遍历一遍链表,将值不为val的值尾插到新创建的头节点后面,最后返回新创建的头结点的下一个节点,同时还可以使用递归。其实更改节点,可将情况分类,待改节点在头、在尾、在中间、然后针对不同情况使用具体实现方法略有不同,分析如下。

答1:

亮点及原理

值得注意到的是,该方法和答2都有使用一个空白的哨兵位,这是因为当头节点的val是待删除的节点时,会出现更改头结点的情况,根据链表的结构的特点,头节点很特殊,不容易直接更改,如果直接更改需要二级指针。但是,更改中间结点的情况是我们熟知的,所以本着将未知问题转化成已知的原则,我们这里使用空白哨兵位,之后返回值就需改为返回该哨兵位的next指针。但是对于这道题可能还会想到使用快慢指针,这就误入歧途了。

代码分析

首先创建哨兵位,初始化其next指针为头节点,后创建指向哨兵位的指针用于遍历,条件为next指针不为空,这就一举两得,解决了判空问题,以及循环。最后循环分两种情况,是和不是。

答2:

亮点及原理

该方法较答1的更加新颖,法一使用的是值为val就删除,本方法使用值不是val就插入,是一个相反的过程,十分巧妙。

代码分析

同样建立一个哨兵位,将其next指针指向空,进行判空,其余步骤与上类似不再赘述。但这里会多一个判断,即尾节点的值为val,这时需要判断删除。

答3:

亮点及代码分析

因为返回值和参数的类型相同所以可以尝试考虑递归,使用递归终止条件为传入的head参数为空,第二个条件分两种情况,当判断的值为val时,这个节点不是我们想要的,所以new_head等于下一个函数的返回值,反之将new_head的next指针指向下一个函数的返回值。这样就达到了,对于所有值是val的节点跳过,反之添加的效果。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c++多态机制

多态 在 C 中,多态(Polymorphism)是一种面向对象编程的重要概念,它允许不同类的对象对同一消息做出不同的响应。具体来说,多态性允许基类的指针或引用在运行时指向派生类的对象,并且根据对象的实际类型来调…

第七届精武杯部分wp

第一部分:计算机和手机取证 1.请综合分析计算机和手机检材,计算机最近一次登录的账户名是 答案:admin 创建虚拟机时直接给出了用户名 2. 请综合分析计算机和手机检材,计算机最近一次插入的USB存储设备串号是 答案&#xff1a…

抖音快速涨粉秘籍解密!从巨量千川投流真实粉丝,快速增粉1000~10万!

随着抖音的风靡,对于众多用户来说,快速涨粉已经成为了追求的目标。在这篇文章中,我们将揭秘全网都在搜索的抖音快速涨1000粉的方法,帮助你打造一个高人气的抖音账号!从巨量千川投流到官方真实流量,再到真实…

外卖系统微信小程序支付

微信小程序支付时序图 其中第9.步骤就是微信小程序前端调用wx.requestPayment

QT7_视频知识点笔记_3_自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口

第三天: 自定义控件,事件处理器⭐,定时器,QPainter,绘图设备,不规则窗口实现 1.自定义控件: 创建新的QT控件类,然后再需要使用的地方--》提升为 来使用如何使用基础控件的信号和槽函数&…

1.前端环境搭建

1.安装nodejs 因为我们开发Vue项目需要使用npm命令来创建和启动,安装node.js是为了获得这个命令,目前和使用node.js无关 下载地址:http://nodejs.cn/download/ 下载完之后安装,通过cmd查看是否安装成功 node --version2.创建项目…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

(1)咱们可以用 decltype () 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量,却行不通。测试如下: 如果把上面的注释去掉会报错: 所以函数类型只有语法意义。但在使用上没有函…

【C语言】/*操作符(下)*/

目录 一、操作符的分类 二、二进制和进制转换 2.1 进制 2.2 进制之间的转换 三、原码、反码、补码 四、单目操作符 五、逗号表达式 六、下标引用操作符[] 七、函数调用操作符() 八、结构体成员访问操作符 8.1 直接访问操作符(.) 8.2 间接访问操作符(->) 九、操作符…

修改el-checkbox样式

一定要在最外层; //未选中框/deep/ .el-checkbox__inner{border-color: #0862a3;}//选中框/deep/ .el-checkbox__input.is-checked .el-checkbox__inner{background-color: #0862a3;border-color: #0862a3;}//未选中框时右侧文字/deep/ .el-checkbox__label{}//选中…

git 推送github 选https遇到登录 openSSH问题

使用https需要使用github令牌token作为密码, 使用SSH不需要登录。 还有一个问题: 创建github仓库后没有quick setup页面解决办法 千万不要点击任何多的操作!!!输入仓库名,直接create!&#x…

return语句

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 return语句 一、return语句后面跟表达式二、return无返回三、return返回的值和函数返回类型不一致四、return语句执行后,后方仍然存在代码五、存在分支语句,需考虑…

去哪里找高清视频素材?推荐几个短视频素材免费网站

在数字时代,视频内容的质量直接影响观众的吸引力和留存率。尤其是高清、4K视频素材和可商用素材,它们在提升视觉质量和叙事深度方面起到了至关重要的作用。以下是一些国内外的顶级视频素材网站,它们提供的资源将为您的创作提供极大的支持和灵…

LeetCode/NowCoder-链表经典算法OJ练习1

目录 说在前面 题目一:移除链表元素 题目二:反转链表 题目三:合并两个有序链表 题目四:链表的中间节点 SUMUP结尾 说在前面 dear朋友们大家好!💖💖💖数据结构的学习离不开刷题…

机器人系统仿真

0、何为仿真 通过计算机对实体机器人系统进行模拟的技术。 1、为何仿真 低成本: 机器人实体一般价格昂贵,为降低机器人学习、调试的成本;高效: 搭建的环境更为多样且灵活,可以提高测试效率以及测试覆盖率&#xff1b…

三大消息传递机制区别与联系

目录 总结放开头 1、定义区别: EventBus Broadcast Receiver Notification 2、使用区别: EventBus Broadcast Receiver Notification 3、补充通知渠道: 通知渠道重要程度 总结放开头 BroadCast Receiver:属于安卓全局监听机制,接收…

【算法】最短路问题 bfs 到 dijkstra

1976、到达目的地的方案数 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路。输入保证你可以从任意路口出发到达其他任意路口,且任意两个路口之间最多有一条路。 给你一个整数 n 和二维整…

五一 大项目--docker-compose编排lnmp完成wordpress

Docker 中的 Nginx 服务为什么要启用 HTTPS 一安装容器 1 安装docker-20.10.17 2 安装所需的依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 添加Docker官方仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos…

Linux-线程概念

1. 线程概念 线程:轻量级进程,在进程内部执行,是OS调度的基本单位;进程内部线程共用同一个地址空间,同一个页表,以及内存中的代码和数据,这些资源对于线程来说都是共享的资源 进程:…

RabbitMQ (windows) 安装

大家好我是苏麟 , 今天安装一下 RabbitMQ . 官网 : RabbitMQ: One broker to queue them all | RabbitMQ 1.点击 Getting Started 2. 点击 Docs 3.点击 Install And Upgrade 4.点击 installation via Chocolatory 5. 直接下载安装包 RabbitMQ 下好了先放在一遍 RabbitMQ 需要 E…

【C++】-------反向迭代器的模拟实现(补充)

目录 前言 一、反向迭代器接口(用户层) 二、模拟实现 三、以vector模拟实现为例 四、总结 前言 在vector和list的接口中我们实际上有说明过反向迭代器的用法,这里就有个问题,并不是只有这两个容器存在反向迭代器的。那么对于他…