删除链表中等于给定值 val 的所有结点(三种方法深入解析)

2024-05-03 21:36

本文主要是介绍删除链表中等于给定值 val 的所有结点(三种方法深入解析),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

又见面啦,接下来的链表相关Oj题目我会根据我自己的理解来给大家讲解,包括解析和代码,希望你可以对链表有更加深入的理解!!


题目:

先上链接:

OJ题目

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

4189df03ee304a54a1f7e8a707f212d5.png

方法一:迭代 

 想法:遍历链表,找到这个val前面一个结点,让这个结点指向val的next

 注意:在寻找为给定值的结点时,需要先判断结点是否为空结点

if (head != nullptr && head->val == val) {head = head->next;
}

 8db00eae410d418abfd1919fcaef00f8.png

 结果如下:

struct ListNode* removeElements(struct ListNode* head, int val) {if (head != nullptr && head->val == val) {head = head->next;
}if(NULL==head){return head;}struct ListNode*pre=head;while(pre->next!=NULL){if(pre->next->val==val){pre->next=pre->next->next;}else {pre=pre->next;}}return head;}

方法二:双指针

31bbdc0944a148c8b82ea5714322ec93.png

设置两个指针,值为head

 3793c861dc6a4f7a829e310fee33b9ca.png

cur右移判断他的val 是否为要删除的值,如果不是pre右移

 89f26529bc2f4c629c81873268f65698.png

 b2e8f99bc022472f9b9eb6bdcfba3be3.png

直到cur->val==val;这个时候的pre就是这个需要删除结点的前结点,让pre->next=cur->next, 遍历完整个链表就可以了

 看一下代码

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

虚拟头结点

可以通过在头结点前增加虚拟头结点,这样子头结点就变成了普通结点

看代码

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode*dummyhead=malloc(sizeof(struct ListNode));if(dummyhead==NULL){return NULL;}dummyhead->next=head;struct ListNode*cur=dummyhead;while(cur->next!=NULL){if(cur->next->val==val){cur->next=cur->next->next;}else{cur=cur->next;}}struct ListNode*retNode=dummyhead->next;free(dummyhead);return retNode;}

3e3ee8879df64331b0cede8137ebe5bc.png


每天进步一点点,积少成多,大家一起努力! 

 

这篇关于删除链表中等于给定值 val 的所有结点(三种方法深入解析)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/957697

相关文章

Java+AI驱动实现PDF文件数据提取与解析

《Java+AI驱动实现PDF文件数据提取与解析》本文将和大家分享一套基于AI的体检报告智能评估方案,详细介绍从PDF上传、内容提取到AI分析、数据存储的全流程自动化实现方法,感兴趣的可以了解下... 目录一、核心流程:从上传到评估的完整链路二、第一步:解析 PDF,提取体检报告内容1. 引入依赖2. 封装

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Python文本相似度计算的方法大全

《Python文本相似度计算的方法大全》文本相似度是指两个文本在内容、结构或语义上的相近程度,通常用0到1之间的数值表示,0表示完全不同,1表示完全相同,本文将深入解析多种文本相似度计算方法,帮助您选... 目录前言什么是文本相似度?1. Levenshtein 距离(编辑距离)核心公式实现示例2. Jac

C#高效实现Word文档内容查找与替换的6种方法

《C#高效实现Word文档内容查找与替换的6种方法》在日常文档处理工作中,尤其是面对大型Word文档时,手动查找、替换文本往往既耗时又容易出错,本文整理了C#查找与替换Word内容的6种方法,大家可以... 目录环境准备方法一:查找文本并替换为新文本方法二:使用正则表达式查找并替换文本方法三:将文本替换为图

SQL Server 查询数据库及数据文件大小的方法

《SQLServer查询数据库及数据文件大小的方法》文章介绍了查询数据库大小的SQL方法及存储过程实现,涵盖当前数据库、所有数据库的总大小及文件明细,本文结合实例代码给大家介绍的非常详细,感兴趣的... 目录1. 直接使用SQL1.1 查询当前数据库大小1.2 查询所有数据库的大小1.3 查询每个数据库的详

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff