算法题:203. 移除链表元素(递归法、设置虚拟头节点法等3种方法)Java实现创建链表与解析链表

news2024/11/26 14:43:41

1、算法思路

讲一下设置虚拟头节点的那个方法,设置一个新节点指向原来链表的头节点,这样我们就可以通过判断链表的当前节点的后继节点值是不是目标删除值,来判断是否删除这个后继节点了。如果不设置虚拟头节点,则需要将头节点和后面的节点分开来讨论,代码会复杂一点。

2、Java代码实现

package listnodes;

//Definition for singly-linked list.
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}

public class RemoveElements {

    public static void main(String[] args) {
        //构造链表
//        int[] nums = new int[]{1,2,6,3,4,5,6};
//        int[] nums = new int[]{7,7,7,7};
        int[] nums = new int[]{1,2,2,1};
        ListNode head = null;
        for (int i = nums.length - 1; i >= 0; i--) {
            ListNode node = new ListNode(nums[i]);
            if(head != null){
                node.next = head;
            }
            head = node;
        }
        //处理链表
        Solution sol = new Solution();
//        ListNode resNode = sol.removeElements(head, 6);//[1,2,3,4,5]
//        ListNode resNode = sol.removeElements(head, 7);//[]
        ListNode resNode = sol.removeElements(head, 2);//[1, 1]

        //遍历链表并打印
        StringBuilder sb = new StringBuilder("[");
        while(resNode != null){
            if(sb.length() != 1) sb.append(", ");
            sb.append(resNode.val);
            resNode = resNode.next;
        }
        sb.append("]");
        System.out.println(sb);
    }
}

// 递归法
//class Solution {
//    public ListNode removeElements(ListNode head, int val) {
//        if (head == null) {
//            return head;
//        }
//        head.next = removeElements(head.next, val);
//        return head.val == val ? head.next : head;
//    }
//}

// 头结点是否删除最后再考虑
//class Solution {
//    public ListNode removeElements(ListNode head, int val) {
//        ListNode pre = head;
//        while(pre != null && pre.next != null){
//            if(pre.next.val == val){
//                //跳过当前节点的后一个节点赋值给当前节点的前一个节点的next,相当于删除当前节点
//                pre.next = pre.next.next;
//            }else{
//                pre = pre.next;
//            }
//        }
//        pre = head;
//        while(pre != null && pre.val == val){
//            pre = pre.next;
//        }
//        return pre;
//    }
//}

// 设置一个虚拟头结点,这样代码更简单
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        ListNode temp = new ListNode(0);
        temp.next = head;
        ListNode pre = temp;
        while(pre.next != null){
            if(pre.next.val == val){
                //跳过当前节点的后一个节点赋值给当前节点的前一个节点的next,相当于删除当前节点
                pre.next = pre.next.next;
            }else{
                pre = pre.next;
            }
        }
        return temp.next;
    }
}

3、完整题目

203. 移除链表元素

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

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

提示:

  • 列表中的节点数目在范围 [0, 10^4] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

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

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

相关文章

网络层重要协议 --- IP协议

小王学习录 今日摘录IP数据报数据报首部IPv4的局限及解决方法 地址管理路由选择扩展&#xff1a;NAT和NAPT的结合使用 今日摘录 关山难越&#xff0c;谁悲失路之人。萍水相逢&#xff0c;尽是他乡之客。 网络层的职责是地址管理和路由选择&#xff0c;在网络层中最重要的协议…

程序员为啥要做副业(05)-业务解决方案缔造者

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

机器人控制——C++ HSM状态机基础知识

本章将向您介绍使用HSM的基本知识。为了简单起见&#xff0c;我们将在这里学习如何编写单层次&#xff08;也称为平面&#xff09;状态机&#xff0c;并在下一章中介绍层次状态机。 让我们从我们可以编写的最简单的状态机开始。 // simplest_state_machine.cpp#include "…

签名加密发送请求

本篇文章介绍下通过HMAC-SHA1加密验证&#xff0c;将加密之后得到的签名作为参数发送请求&#xff0c;假如咱们需要按照下列要求将参数加密之后传递&#xff1a; 咱们来逐步分析得到签名的步骤和最终发送请求需要携带的参数内容&#xff0c;本次实现是在node.js的环境下。 首先…

计算机系统

由计算机硬件系统和计算机软件系统组成的综合体 冯诺伊曼计算机 定义 以“存储程序”的概念为基础的各类计算机通称为冯诺伊曼机 特点 计算机由运算器、存储器、控制器、输入设备和输出设备五大部件组成指令和数据以同等地位存放于存储器内&#xff0c;并可按地址寻访指令和…

Python Faker批量生成测试数据

一、前言 在做自动化测试或压力测试时会需要大批量生成测试数据&#xff0c;简单的方式你可以写一个存储过程使用随机函数来生成记录&#xff0c;但这种生成数据看起来不够真实&#xff0c;其实有蛮多现成的工具可以完成这一任务。 二、Faker基本使用介绍 faker是一个生成伪…

Python零基础入门教程(非常详细)

目前python可以说是一门非常火爆的编程语言&#xff0c;应用范围也非常的广泛&#xff0c;工资也挺高&#xff0c;未来发展也极好。 Python究竟应该怎么学呢&#xff0c;我自己最初也是从零基础开始学习Python的&#xff0c;给大家分享Python的学习思路和方法。一味的买书看书…

从零开始搭建微服务(一)

构建项目父工程 添加公共核心模块 安装nacos 安装nacos nacos 文档地址&#xff1a; https://nacos.io/zh-cn/docs/what-is-nacos.html 本文使用版本2.2.2 下载地址&#xff1a;https://github.com/alibaba/nacos/archive/refs/tags/2.2.2.zip 使用nacos 我们下载是源代码 解…

轻松编写第一个油猴脚本

第一步&#xff1a;安装油猴 首先&#xff0c;我们需要安装油猴。油猴是一个免费的浏览器扩展&#xff0c;可让您在浏览器中运行脚本。 在 Chrome 浏览器中&#xff0c;可以通过以下步骤安装油猴&#xff1a; 在 Chrome 浏览器中打开 Chrome 网上应用店。搜索 "油猴&qu…

揭秘ChatGPT的智慧密码:向量数据库的神奇作用解析

2023年8月&#xff0c;亚马逊云科技推出了自己的向量引擎Amazon OpenSearch Serverless向量引擎&#xff0c;这被认为是其旗下大语言模型Amazon Titan超越ChatGPT的一个重要契机。 那么&#xff0c;这个Amazon OpenSearch Serverless向量引擎有何厉害之处&#xff1f;为什么能…

Elasticsearch:ES|QL 中的数据丰富

在之前的文章 “Elasticsearch&#xff1a;ES|QL 查询语言简介”&#xff0c;我有介绍 ES|QL 的 ENRICH 处理命令。ES|QL ENRICH 处理命令在查询时将来自一个或多个源索引的数据与 Elasticsearch 丰富索引中找到的字段值组合相结合。这个有点类似于关系数据库查询中所使用的 jo…

数据治理概念篇:(一)相关术语与名词

数据治理内容众多&#xff0c;其中与数据治理相关名词和术语也是多不胜数。下面记录一下常见的数据治理相关名词。 1.数据仓库 1.1.名词解释 Bill Inmon 将数据仓库定义为&#xff1a;“面向主题的、整合的、随时间变化的、相对稳定的支持管理决策的数据集合”。 Ralph Kimbal…

【python】爬取斗鱼直播照片保存到本地目录

一、导入必要的模块&#xff1a; 这篇博客将介绍如何使用Python编写一个爬虫程序&#xff0c;从斗鱼直播网站上获取图片信息并保存到本地。我们将使用requests模块发送HTTP请求和接收响应&#xff0c;以及os模块处理文件和目录操作。 如果出现模块报错 进入控制台输入&#xff…

APP开发:用途与未来前景|软件定制开发|网站小程序建设

APP开发&#xff1a;用途与未来前景|软件定制开发|网站小程序建设 APP开发已成为现代科技趋势的一部分&#xff0c;无论是日常生活还是商业领域&#xff0c;都有它的身影。通过开发APP&#xff0c;我们可以将想法、功能和内容转化为直观、易用的移动设备应用程序&#xff0c;满…

【算法| 差分 No.1】AcWing 797. 差分 AcWing 798. 差分矩阵

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望对大家有所帮…

Spring中@Async的使用技巧

引言 在Java开发中&#xff0c;我们常常会遇到需要执行耗时操作的场景&#xff0c;例如文件上传、网络请求等。为了提高系统的响应速度和并发能力&#xff0c;我们可以使用异步方法来处理这些任务。本文将介绍如何在Java中使用异步方法&#xff0c;并探讨其中的一些注意事项。…

棋牌室电脑计时灯控,棋牌室计时灯控安装,佳易王计时计费管理系统软件

棋牌室电脑计时灯控&#xff0c;棋牌室计时灯控安装&#xff0c;佳易王计时计费管理系统软件 棋牌室的灯可以用佳易王计时计费软件来控制开关&#xff0c;当开始计时的时候&#xff0c;软件发送开灯的指令&#xff0c;灯打开&#xff0c;在结账后&#xff0c;软件发送关灯指令…

酷开科技 | 酷开系统里萌萌哒小维在等你!

在一片金黄淡绿的颜色中&#xff0c;深秋的脚步更近了&#xff0c;在这个气候微凉的季节里&#xff0c;你是不是更想拥有一种温暖的陪伴呢&#xff1f;酷开科技智慧AI语音功能更懂你&#xff0c;贴心的小维用心陪伴你的每一天。 01.全天候陪伴 在酷开系统中&#xff0c;只要你…

华为OD机试 - 高效的任务规划 - 逻辑分析(Java 2023 B卷 200分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

操作系统(一):进程状态与进程调度

前言 操作系统作为计算机基础的四大件&#xff0c;系统学习无疑是十分重要的。在这个系列的文章中&#xff0c;荔枝会结合操作系统的知识进行归纳梳理&#xff0c;总结输出博文&#xff01;下面这篇文章主要介绍的是进程状态和调度&#xff0c;重点是几种调度算法的理解和掌握&…