Leetcode: 203. 移除链表元素

题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

难度:简单

题目链接:203. 移除链表元素

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

方法一: 

题目解析:

遍历链表,删除指定元素(val)

代码展示

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode* pre = NULL,*cur = head;while(cur){if(cur->val == val){struct ListNode* next = cur->next;free(cur);if(pre == NULL) //删除第一个节点时,free之后,head就变成了也指针{//为了避免head变成野指针head = next;}else{pre->next = next;}cur = next;//继续去找元素}else{pre = cur;cur = cur->next;}}return head; //返回新的头节点
}

删除元素的主要思想

这样的话就要考虑如何找被删除元素的前一个结点,和被删除元素的下一个结点。

 于是这里采用双指针

pre 指针 记录前一个结点,cur 记录指向的当前结点

前提是:删去的不是第一个结点的情况下

第一步

第二步

 

 删除的结点是第一个结点时:

即此时的 pre  是NULL ,cur指向的是head(第一个结点),删去结点(free(cur))。

这里free(cur)  会把第一个结点的内存空间释放返回给操作系统,pre->next = next;会出现问题

加上

            if(pre == NULL) //删除第一个节点时,free之后,head就变成了也指针{//为了避免head变成野指针head = next;}else{pre->next = next;}cur = next;//继续去找元素

if(pre == NULL)   --- (只有 一个结点 的情况 而且 是要删除的结点)

 这种情况直接让 head 指向 next(代表cur->next,这里也就是NULL) 

因为 要删除的元素可能不仅仅是一个,也有可能是多个。所以每次删完一个元素的时候,注意pre指针的指向和cur指针的指向

之后再去重复上述第二步,直到cur遍历完链表。 

方法二

主要思想:

先让cur指向第一个结点,遍历结点,把不等于val的值给放到新的链表里。然后返回新的链表头指针即可。

代码

struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode* newhead = NULL,*tail = NULL;struct ListNode* cur = head;while(cur){if(cur->val != val ){if(tail == NULL){newhead = 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;
}

图解

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

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

相关文章

亚信安慧AntDB 数据库:超融合数据库引领实时计算新时代

近期,亚信科技成功举办了以“数智驱动 全栈赋能”为主题的2022年度系列产品发布会的“数据库专场”。在这次发布会上,亚信科技发布了AntDB V7.2数据库,这是一款“超融合一体流式引擎”的重要产品,并分享了在通信、交通等行业中的应…

056:vue工具 --- CSS在线格式化

第056个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下,本专栏提供行之有效的源代码示例和信息点介绍,做到灵活运用。 (1)提供vue2的一些基本操作:安装、引用,模板使…

密码明文传输漏洞 原理以及修复方法

漏洞名称 : 密码明文传输 漏洞描述 : 密码明文传输一般存在于web网站登录页面,用户名或者密码采用了明文传输,容易 被嗅探软件截取。 检测条件 :1、 已知Web网站具有登录页面。 检测方法: 1、 找到网站或者web系统登录页面。…

VR党建:VR全景技术如何助力党建知识传播

导语: 随着科技的不断发展,虚拟现实技术逐渐深入人们生活的方方面面。VR全景技术作为一种全新的沉浸式体验方式,被广泛应用于娱乐、教育、医疗等领域。而在党建学习中,VR全景技术也展现出了巨大的潜力,成为了一种创新…

[学习笔记]批量迁移数据库文件

拷贝数据库文件 首先在本地运行如下SQL语句,查看数据库文件的磁盘位置 SELECT name, physical_name AS CurrentLocation, state_desc FROM sys.master_files默认是保存在C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA目录下 首先复制数据…

青藤销售云助力企业数智化销售

青藤销售云助力企业数智化销售覆盖: 1.人工自动外呼群呼 2.AI电销销售机器人自动筛选意向客户 3.crm企业微信智能客户管理运行系统 4.电话回拨系统不限拨打频次高频外呼不封号 5.语音通知系统覆盖工单提醒、发货提醒、缴费提醒等场景 6.手机号外显专号专用高接通率线…

GO 的 socks5代理 编写

这里学习一下 socks5 代理的编写 网上有很多 学习一下 go 语言实战入门案例之实现Socks5 - 知乎 滑动验证页面 socks5协议原理学习-腾讯云开发者社区-腾讯云 (tencent.com) 首先我们要了解一下socks5的代理方式 socks5 是基于 认证建立连接转发数据 所形成的代理 我们只…

ehr是什么意思?ehr系统主要干什么的

随着科技的发展,企业管理方式也在不断变革。其中,ehr系统作为一种新兴的人力资源管理工具,受到了越来越多企业的关注。那么,ehr到底是什么意思?它是干什么的?主要能解决哪些企业痛点呢?接下来&a…

电影小镇智慧旅游项目技术方案:PPT全文111页,附下载

关键词:智慧旅游项目平台,智慧文旅建设,智慧城市建设,智慧文旅解决方案,智慧旅游技术应用,智慧旅游典型方案,智慧旅游景区方案,智慧旅游发展规划 一、智慧旅游的起源 智慧地球是IB…

带大家做一个,易上手的家常蛋炒饭

先打两个鸡蛋 用筷子搅拌均匀 准备一定的花椒和干辣椒 具体看个人喜好 起锅烧油 倒入鸡蛋液 这个过程记得用锅铲动一动 鸡蛋 被粘锅了 等鸡蛋基本定型之后 捞出来 倒入干辣椒 花椒 剩饭 进行翻炒 然后倒入小半勺老抽 翻炒两下 然后重新将鸡蛋下进去 一起翻炒 用锅铲将鸡…

linux命令速查表

这是一个linux常见命令的列表! 相关学习资料:【收藏】Linux系统常用命令速查手册(附PDF下载方式)_linux命令大全详解pdf-CSDN博客文章浏览阅读651次。给大家收集整理了日常常用的Linux系统命令,仅供大家参考。大家如…

中华儿慈会回家的希望宝贝守护计划儿童安全反拐宣传活动

为帮助低龄段儿童树立防拐反拐意识,提高儿童自护自救能力,近日,遂宁艺宁妇女儿童社会工作服务中心在汤普森幼儿园等学校开展了中华儿慈会回家的希望宝贝守护计划活动。 讲师志愿者通过设定动画人物形象讲述防拐故事,教授儿童遇到陌…