【算法系列-链表】移除链表元素

news2024/10/1 19:26:16

【算法系列-链表】移除链表元素

欢迎来到【算法系列】第二弹 🏆 链表,接下来我们将围绕链表这类型的算法题进行解析与练习!一起加油吧!!( •̀ ω •́ )✧✨

文章目录

  • 【算法系列-链表】移除链表元素
    • 1. 算法分析🛸
    • 2. 在原链表上删除
      • 2.1 思路分析🎯
      • 2.2 解题过程🎬
      • 2.3 代码示例🌰
    • 3. 使用虚拟头节点删除
      • 3.1 思路分析🎯
      • 3.2 解题过程🎬
      • 3.3 代码示例🌰

1. 算法分析🛸

对于链表类的算法题,一般题目都会给我们默认提供好了链表节点 ListNode,不过在真实场景下若我们需要进行手撕算法题时也需要自己写出这个ListNode,这里我就先给帖出来了(这里提供的是Java版本):

public class ListNode {
	int val;
	ListNode next;
	public ListNode() {};
	public ListNode(int val) {
		this.val = val;
	}
	public ListNode(int val, ListNode next) {
		this.val = val;
		this.next = next;
	}
}

【题目链接】:LeetCode 203 移除链表元素

对于上述这道题,我们需要删除符合目标值的节点,根据处理逻辑我提供了两者方案:

  • 在原链表上删除
  • 使用虚拟头节点删除

而二者的主要区别就在于:对头节点的处理方案

2. 在原链表上删除

2.1 思路分析🎯

通过画图分析很清晰就能得出解决方案:

在这里插入图片描述

由图解可知,只需要让当前节点cur指向当前节点的下一个节点的下一个节点即可删除节点

2.2 解题过程🎬

定义一个节点cur让其指向头节点,后续的每次遍历使用cur即可,head不变后面用来返回结果,这里有一个地方需要注意,那就是头节点的值如果也是目标值的话,我们也需要删除这个节点,删除方式就是让头节点指向头节点的下一个节点,即 head = head.next,这里可以通过循环进行删除

之后进入新的循环,当 cur != null && cur.next != null 时,进行判断: 若cur.next.val 不等于目标值,则让cur指向下一个节点,即 cur = cur.next; 若 cur.next.val 等于目标值,则让cur.next = cur.next.next 即可完成删除,注意这里不用让cur = cur.next,因为你不确定此时的cur.next 是否也等于目标值,一旦让 cur 往下走在单链表中此时的cur将无法删除; 直到循环结束,返回头节点即可

2.3 代码示例🌰

class Solution {
    public ListNode removeElements(ListNode head, int val) {

        while (head != null  && head.val == val) {
            head = head.next;
        }

        ListNode cur = head;
        while (cur != null && cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;
                continue;
            }
            cur = cur.next;
        }
        return head;
    }
}

3. 使用虚拟头节点删除

3.1 思路分析🎯

这道题的解决思路与在原始链表上删除节点不同,在原始链表上删除节点我们需要考虑到头节点与普通节点的删除方式是不同的,而这里使用虚拟头节点来删除节点则可以将删除方式都统一化

在这里插入图片描述

从图解中可以看到,这里我们删除头节点不需要循环遍历 head = head.next,而是让cur指向虚拟头节点,统一使用 cur.next = cur.next.next即可

3.2 解题过程🎬

定义一个虚拟头节点 vhead,并让vhead的下一个节点指向头节点head, 并定义节点cur 指向该节点,后续的每次遍历使用cur即可;

之后进入新的循环,当 cur != null && cur.next != null 时,进行判断: 若cur.next.val 不等于目标值,则让cur指向下一个节点,即 cur = cur.next; 若 cur.next.val 等于目标值,则让cur.next = cur.next.next 即可完成删除,注意这里不用让cur = cur.next,因为你不确定此时的cur.next 是否也等于目标值,一旦让 cur 往下走在单链表中此时的cur将无法删除; 直到循环结束,返回 vhead.next 即可

3.3 代码示例🌰

class Solution {
    public ListNode removeElements(ListNode head, int val) {

        ListNode vhead = new ListNode();
        vhead.next = head;
        ListNode cur = vhead;
        while (cur != null && cur.next != null) {
            if (cur.next.val == val) {
                cur.next = cur.next.next;
                continue;
            }
            cur = cur.next;
        }
        return vhead.next;
    }
}

以上便是对移除链表元素类型题的介绍了!!后续还会继续分享其它算法系列内容,如果这些内容对大家有帮助的话请给一个三连关注吧💕( •̀ ω •́ )✧( •̀ ω •́ )✧✨

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

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

相关文章

Spring Data(学习笔记)

JPQL语句???(Query括号中的就是JPQL语句) 怎么又会涉及到连表查询呢? 用注解来实现表间关系。 分页是什么?为什么什么都有分页呢 ? 继承,与重写方法的问题 Deque是什么 ?…

线程池:线程池的实现 | 日志

🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据…

C++容器之vector模拟实现(代码纯享版!!!)

目录 前言 一、头文件 .h文件 总结 前言 本文是模拟实现vector部分功能的代码&#xff0c;可以直接拿去使用 一、头文件 .h文件 #include<assert.h> #include<iostream> using namespace std; namespace zz {template<class T>class vector{public:typedef…

C++ set,multiset与map,multimap的基本使用

1. 序列式容器和关联式容器 string、vector、list、deque、array、forward_list等STL容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0c;比如交换一下&#xff0c;他依旧是序列式容器。顺…

STM32器件支持包安装,STLINK/JLINK驱动安装

一、支持包安装 1、离线安装 先下载支持包之后&#xff0c;再进行安装。如下图要安装STM32F1系列&#xff0c;双击 出现如下&#xff0c;会自动锁定安装路径&#xff0c;然后点击下一步&#xff0c;直接安装。 2、在线安装 首先需要电脑联网。如下。先点击第一个红框绿色按钮…

常见的VPS或者独立服务器的控制面板推荐

随着越来越多的企业和个人转向VPS和独立服务器以获得更高的性能和灵活性&#xff0c;选择合适的控制面板变得尤为重要。一个好的控制面板可以大大简化服务器管理&#xff0c;提高工作效率。本篇文章将介绍2024年最值得推荐的VPS控制面板&#xff0c;帮助您做出明智的选择。 1.…

STL容器适配器

欢迎来到本期节目- - - STL容器适配器 适配器模式&#xff1a; 在C中&#xff0c;适配器是一种设计模式&#xff0c;有时也称包装样式&#xff1b; 通过将类自己的接口包裹在一个已存在的类中&#xff0c;使得因接口不兼容而不能在一起工作的类能在一起工作&#xff1b; 也就…

使用VBA快速生成Excel工作表非连续列图片快照

Excel中示例数据如下图所示。 现在需要拷贝A2:A15,D2:D15,J2:J15,L2:L15,R2:R15为图片&#xff0c;然后粘贴到A18单元格&#xff0c;如下图所示。 大家都知道VBA中Range对象有CopyPicture方法可以拷贝为图片&#xff0c;但是如果Range对象为非连续区域&#xff0c;那么将产生10…

详解DHCP服务工作原理及配置案例

一. DHCP概述 DHCP&#xff08;Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议&#xff09;是一个主机IP简化分配管理的TCP/IP协议&#xff0c;用户通过DHCP服务器动态的分配给客户端IP地址及其他环境的配置工作&#xff0c;包括IP地址、子网掩码、网关和…

【NVIDIA】如何使用nvidia-smi命令管理和监控GPU

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

KPConv: Flexible and Deformable Convolution for Point Clouds

Abstract Kernel Point Convolution&#xff08;KPConv&#xff09;是一种点云卷积方法&#xff0c;它可以直接在点云数据上进行操作&#xff0c;无需任何中间的表示形式。方法的核心在于使用核点来定义卷积权重&#xff0c;核点位于欧几里得空间中&#xff0c;并仅对靠近它们…

Spring DI 笔记

目录 1.什么是DI? 2.依赖注入的三种⽅式 2.1属性注⼊ 2.2构造⽅法注⼊ 2.3Setter 注⼊ 2.4三种注⼊优缺点分析 3.Autowired存在问题 1.什么是DI? DI: 依赖注⼊ 依赖注⼊是⼀个过程&#xff0c;是指IoC容器在创建Bean时, 去提供运⾏时所依赖的资源&#xff0c;⽽资源指的…

(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述&#xff1a; 1.1 生活中的栈 存储货物或供旅客住宿的地方&#xff0c;可引申为仓库、中转站。例如酒店&#xff0c;在古时候叫客栈&#xff0c;是供旅客休息的地方&#xff0c;旅客可以进客栈休息&#xff0c;休息完毕后就离开客栈 1.2计算机中的栈 将生活中的…

第1 章 第一节:基础语法

第1 章 第一节&#xff1a;基础语法 1.1书写规则 1.1.1关键字 在Java语言中&#xff0c;已经定义好的&#xff0c;具有一定的功能和作用的英文单词。所有的关键字都是小写的 在Java中总共有51个关键字&#xff0c;还有两个保留字const\goto. 常见的关键字&#xff1a; if…

User-Agent在WebMagic爬虫中的重要性

对于需要从网站上抓取数据的开发者来说&#xff0c;WebMagic是一个强大的工具。它是一个简单灵活的Java爬虫框架&#xff0c;用于抓取网页数据。在爬虫技术中&#xff0c;User-Agent&#xff08;用户代理&#xff09;是一个关键的HTTP请求头&#xff0c;它告诉服务器关于客户端…

中九无科研无竞赛保研经验帖——上交软院、中科大计算机、复旦工程硕、南大工程硕、浙大软件

本人bg: 学校&#xff1a;中九软件工程rk&#xff1a;夏令营5%&#xff0c;预推免3%&#xff08;都是写的预估排名&#xff09;六级&#xff1a;480&#xff0c; 四级&#xff1a;540科研&#xff1a;无竞赛&#xff1a;美赛M&#xff0c;以及水赛国三、省二若干 保研前期没有…

jenkins项目发布基础

随着软件开发需求及复杂度的不断提高,团队开发成员之间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。Jenkins 自动化部署可以解决集成、测试、部署等重复性的工作,工具集成的效率明显高于人工操作;并且持续集成可以更早的获取代码变更的信息,…

向日葵远程控制怎么下载?推荐4个远程控制工具网站。

从官网下载的软件质量有保障&#xff0c;安全性和可信度也比较好。所以不管需要使用什么样的软件&#xff0c;最好是到官网下载。如果是有远程控制的需求&#xff0c;我可以推荐几个安全可靠的网站给大家。 &#xff11;、向日葵远程控制大师 直达链接&#xff1a;https://dow…

【STM32单片机_(HAL库)】4-3【定时器TIM】定时器输出PWM实现呼吸灯实验

1.硬件 STM32单片机最小系统LED灯模块 2.软件 pwm驱动文件添加定时器HAL驱动层文件添加GPIO常用函数定时器输出PWM配置步骤main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "pwm.h"int main(void) {HA…

运用循环单链表实现约瑟夫问题

代码&#xff1a; #include <iostream> using namespace std; struct node {int id;node *next; }; int len0; //存现在链表的长度int main() {node*head,*temp,*tail;headnew node;head->next head;tailhead;int A,B;cin>>A>>B;lenA;int num1;while…