【算法|虚拟头节点|链表】移除链表元素

Leetcode203

移除链表元素

题目描述:

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

示例 1:

img

输入: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
输出:[]

原链表操作

如果我们选择在原链表上进行操作的话,我们需要考虑两个方面的问题:

  1. 头节点为我们要移除的元素
  2. 非头结点为我们要移除的元素

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Java版本

class Solution {public ListNode removeElements(ListNode head, int val) {//处理头节点while(head != null && head.val == val){head = head.next;} //处理头节点为空的情况if(head == null){return head;}//确保head.val != val 的情况ListNode pre = head;ListNode cur = head.next;while(cur != null){if(cur.val == val){pre.next = cur.next;}else{pre = cur;}cur = cur.next;}return head;}
}
class Solution {public ListNode removeElements(ListNode head, int val) {while(head != null && head.val == val){head = head.next;}ListNode cur = head;while(cur != null){while(cur.next != null && cur.next.val == val){cur.next = cur.next.next;}cur = cur.next;}return head;}
}

C++版本

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {//删除头节点while(head != NULL && head->val == val){ListNode* tmp = head;head = head->next;delete tmp;}//删除非头结点ListNode* cur = head;while(cur != NULL && cur->next != NULL){if(cur->next->val == val){ListNode* tmp = cur->next;cur->next = cur->next->next;delete tmp;}else{cur = cur->next;}}return head;}
};

虚拟头节点

介绍

虚拟头节点是一种在链表中使用的特殊节点,它通常作为头节点的前一个节点,但是不存储具体的数据。它的目的是为了简化链表的操作,特别是在处理边界条件和插入、删除操作时提供便利。

在传统的链表实现中,如果要对链表进行插入或者删除操作,我们需要分别处理头节点的情况和中间节点的情况。这样就需要额外的代码来处理这些边界情况,增加了代码的复杂度。

而使用虚拟头节点,我们可以将这些特殊情况都统一为对中间节点的操作。具体来说,虚拟头节点就像是链表中的一个普通节点,但是它不存储具体的数据。当链表为空时,虚拟头节点就是唯一的节点,它的下一个节点就是链表的真正的头节点。当链表非空时,虚拟头节点的下一个节点就是链表的真正的头节点。

插入操作时,我们只需要将新节点插入到虚拟头节点的后面即可,而不需要单独处理头节点为空的情况。删除操作时,我们只需要将虚拟头节点的后继节点指向要删除的节点的后继节点即可,而不需要单独处理删除头节点的情况。

使用虚拟头节点的好处是简化了链表的操作逻辑和代码,让代码更加简洁和可读。同时,它也保证了链表的头节点和其他节点的统一性,避免了对头节点的特殊处理。

总结起来,虚拟头节点是一个不存储具体数据的特殊节点,它位于真正的头节点之前,用于简化链表的操作和处理边界情况。它统一了对头节点和其他节点的操作,使得代码更加简洁和可维护

所以当我们在原链表操作时,我们需要针对每一种情况去编写逻辑,但使用虚拟头结点的话,就可以统一移除节点这一操作~

Java版本

class Solution {public ListNode removeElements(ListNode head, int val) {ListNode dummyHead = new ListNode(-1);dummyHead.next = head;ListNode pre = dummyHead;while(pre.next != null){if(pre.next.val == val){pre.next = pre.next.next;}else{pre = pre.next;}}return dummyHead.next;}
}

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

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

相关文章

通过curl命令分析http接口请求各阶段的耗时等

目录 一、介绍二、功能1、-v 输出请求 响应头状态码 响应文本等信息2、-x 测试代理ip是否能在该网站使用3、-w 额外输出查看接口请求响应的消耗时间4、-o 将响应结果存储到文件里面5、-X post请求测试 (没测成功用的不多) 一、介绍 Curl是一个用于发送和接收请求的命令行工具和…

使用Python CV2融合人脸到新图片--优化版

优化说明 上一版本人脸跟奥特曼图片合并后边界感很严重,于是查找资料发现CV2还有一个泊松函数很适合融合图像。具体代码如下: import numpy as np import cv2usrFilePath "newpic22.jpg" atmFilePath "atm2.jpg" src cv2.imrea…

基于matlab实现的额 BP神经网络电力系统短期负荷预测未来(对比+误差)完整程序分享

基于matlab实现的额 BP神经网络电力系统短期负荷预测 完整程序: clear; clc; %%输入矢量P(15*10) P[0.2452 0.1466 0.1314 0.2243 0.5523 0.6642 0.7105 0.6981 0.6821 0.6945 0.7549 0.8215 0.2415 0.3027 0; 0.2217 0.1581 0.1408 0.23…

【JVM 内存结构丨堆】

堆 定义内存分配特点:分代结构对象分配过程Full GC /Major GC 触发条件引用方式堆参数堆内存实例 主页传送门:📀 传送 定义 JVM(Java Virtual Machine)堆是Java应用程序运行时内存管理的重要组成部分之一。堆内存用于存储Java对象…

深度思考ES面经

1 推荐文章 2万字详解,吃透 Elasticsearch 2 什么是倒排索引,为什么这么叫? 倒排索引(Inverted Index)是一种为快速全文搜索而设计的数据结构。它被广泛应用于搜索引擎,其中 Elasticsearch(简…

CVPR2023 RIFormer, 无需TokenMixer也能达成SOTA性能的极简ViT架构

编辑 | Happy 首发 | AIWalker 链接 | https://mp.weixin.qq.com/s/l3US8Dsd0yNC19o7B1ZBgw project, paper, code Token Mixer是ViT骨干非常重要的组成成分,它用于对不同空域位置信息进行自适应聚合,但常规的自注意力往往存在高计算复杂度与高延迟问题。…

软文推广在企业中运用的优势有哪些?

随着互联网的发展,越来越多的企业在推广方式上已经逐渐脱离于传统媒体,软文推广已经成为了企业宣传的主要方式。也有不少企业来找盒子进行推广,接下来媒介盒子就来告诉大家,企业进行软文推广的优势有哪些? 成本低 传统…

ELK 企业级日志分析系统 ELFK

目录 一、概述 二、组件介绍 2.1、ElasticSearch 2.2、Kiabana 2.3、Logstash 2.4、可以添加的其它组件:Filebeat 2.5、缓存/消息队列(redis、kafka、RabbitMQ等) 2.6、Fluentd 三、ELK工作原理 四、实例演示 1.ELK之 部署"E&q…

Leetcode 剑指Offer

求 12...n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。 示例 1: 输入: n 3 输出: 6示例 2: 输入: n 9 输出: 45 一、信息 1.求一个等差数列的求和 2.要求不能使…

lua环境搭建数据类型

lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。 1.首先我们需要下载lua开发工具包 在这里我们使用的工具是luadist 下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。 2.接下来就是老生…

ARM 相关概念2

一、汇编中三种符号(汇编指令、伪指令、伪操作) 二、汇编基本格式 三、数据操作指令 3.1 数据搬移指令mov/mvn ① 示例 ② 立即数 0xff000000 >判断的数 1111 1111 0000 0000 0000 0000 0000 0000 >判断的数 0000 0000 0000 0000 0000 0000 1111…

企业架构LNMP学习笔记51

企业案例使用: 主从模式: 缓存集群结构示意图: 去实现Redis的业务分离: 读的请求分配到从服务器上,写的请求分配到主服务器上。 Redis是没有中间件来进行分离的。 是通过业务代码直接来进行读写分离。 准备两台虚…

华为云云耀云服务器L实例评测|部署前后端分离项目

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: 学习测评 ✨特色专栏: MyS…

2022年全国研究生数学建模竞赛华为杯D题PISA架构芯片资源排布问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 D题 PISA架构芯片资源排布问题 原题再现: 一、背景介绍 芯片是电子行业的基础,在当前日益复杂的国际形势下,芯片成了各个大国必争的高科技技术。本课题关注网络通信领域的交换芯片,传统的交…

Python爬虫逆向猿人学刷题系列——第七题

题目:采集这5页中胜点列的数据,找出胜点最高的召唤师,将召唤师姓名填入答案中 地址:https://match.yuanrenxue.cn/match/7 本题主要是考察字体的动态变化,同样也是从字体文件下手构造出映射关系就好,但本题…

TuyaOS开发学习笔记(2)——NB-IoT开发SDK架构、运行流程

一、SDK架构 1.1 架构框图 基于 TuyaOS 系统,可以裁剪得到的适用于 NB-IoT 协议产品接入的 SDK。SDK 将设备配网、上下行数据通信、产测授权、固件 OTA 升级等接口进行封装,并提供相关函数。 1.2 目录结构 1.2.1 TuyaOS目录说明 adapter:T…

70、Spring Data JPA 的 自定义查询(全手动,自己写完整 SQL 语句)

1、方法名关键字查询(全自动,既不需要提供sql语句,也不需要提供方法体) 2、Query查询(半自动:提供 SQL 或 JPQL 查询) 3、自定义查询(全手动) ★ 自定义查询&#xff08…

范文展示,如何三步写出一篇满意的论文

第一步:输入文章关键信息 文章标题,写论文的话即为拟定的论文标题,例如这篇范文中的题目为“阳明心学研究” 关键词,可以写出多个论文主题相关的关键词,用逗号分开,例如这篇范文中只写了一个关键词“王阳…

9.12 C++作业

实现一个图形类(Shape),包含受保护成员属性:周长、面积, 公共成员函数:特殊成员函数书写 定义一个圆形类(Circle),继承自图形类,包含私有属性:半…

长城网络靶场第三题

关卡描述:1.oa服务器的内网ip是多少? 先进行ip统计,开始逐渐查看前面几个ip 基本上都是b/s,所以大概率是http,过滤一下ip 第一个ip好像和oa没啥关系 第二个ip一点开就是 oa,应该就是他了。 关卡描述&a…