[算法通关村] 1.3 链表的删除

news2024/10/3 2:25:54

上一节我们谈到了链表的头插、尾插、中间插入的方法,忘记的小伙伴可以复习一下:

[算法通关村] 1.2 链表的插入


 

        接下来,完成链表的删除工作,我们在上一节的学习中,分别在链表的开头、中间和结尾插入了节点,现在我们想使链表恢复原来的样子,即:1 -> 2 -> 3 -> 4 -> 5,这需要我们分别删除位于头部的 72、位于第三位的节点 30、以及作为结尾的节点 9,这部分内容是比较简单的,按照惯例,完整代码放在最下方。

删除中间节点

        删除中间节点时,只需要找到它的前驱结点,使前驱结点的 next 指向它的 next 节点即可,此时由于不存在引用关系,会被 JVM 回收。

 

        其关键代码如下:

cur.next = cur.next.next;

删除头部结点

        删除头部节点十分简单,直接让 head 指向 head.next 即可,直接给出图和代码:

return head.next;

 

删除尾部结点

        删除尾部节点同样容易,只需要将尾部节点的前一个节点中 next 变量值等于 null 即可,同样直接给出图与代码:

cur.next = cur.next.next;

 

完整代码

         下面给出该部分的完整代码:

class NewNode {

    public int val;
    public NewNode next;

    NewNode(int val) {
        this.val = val;
        this.next = null;
    }
}

public class BasicLinkList {

    public static void main(String[] args) throws Exception {
        // 先创建一个链表
        NewNode linkedList = BasicLink.initLinkedList(new int[]{1, 2, 3, 4, 5});

        NewNode newNode;

        // 中间插入节点:在第 3 个节点前,插入 val = 30
        // 头部插入节点:插入 val = 72
        // 尾部插入节点:插入 val = 9

        // 中间删除节点:第 4 个节点
        System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, 4)));
        System.out.println("========");
        // 头部删除节点:
        linkedList = BasicLinkList.deleteNode(linkedList, 1);
        System.out.println(BasicLinkList.toString(linkedList));
        System.out.println("========");
        // 尾部删除节点:
        System.out.println(BasicLinkList.toString(BasicLinkList.deleteNode(linkedList, BasicLinkList.getLength(linkedList))));
    }

    /**
     * 获取链表长度
     *
     * @param linkedList 链表头节点
     * @return 链表长度
     */
    public static int getLength(NewNode linkedList) throws Exception {
        int length = 0;
        NewNode current = linkedList;
        while (current != null) {
            length++;
            current = current.next;
        }
        if (length == 0) {
            throw new Exception("链表不存在");
        }
        return length;
    }

    /**
     * 删除节点
     *
     * @param head     链表头节点
     * @param position 删除节点位置,取值从1开始
     * @return 删除后的链表头节点
     */
    public static NewNode deleteNode(NewNode head, int position) throws Exception {

        if (position < 1 || position > getLength(head)) {
            throw new Exception("参数:拟删除位置 越界");
        }
        if (position == 1) {
            //curNode就是链表的新head
            return head.next;
        }

        NewNode cur = head;
        int count = 1;
        // 找到拟删除节点的前一个节点
        while (count < position - 1) {
            cur = cur.next;
            count++;
        }

        cur.next = cur.next.next;

        return head;
    }

    /**
     * 输出链表
     *
     * @param head 头节点
     */
    public static String toString(NewNode head) {
        NewNode current = head;
        StringBuilder stringBuilder = new StringBuilder();
        while (current != null) {
            stringBuilder.append(current.val).append("\t");
            current = current.next;
        }
        return stringBuilder.toString();
    }
}

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

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

相关文章

【USACO OPEN12铜组】岛屿

【USACO OPEN12铜组】岛屿 文章目录 【USACO OPEN12铜组】岛屿题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 思路code 2014. 岛 - AcWing题库 题目描述 每当下雨时&#xff0c;农夫约翰的田地总是被洪水淹没。 由于田地不是完全水平的&#xf…

Cesium态势标绘专题-扇形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

(五)FLUX中的数据类型

以下内容来自 尚硅谷&#xff0c;写这一系列的文章&#xff0c;主要是为了方便后续自己的查看&#xff0c;不用带着个PDF找来找去的&#xff0c;太麻烦&#xff01; 第 5 章 FLUX中的数据类型 5.1 10 个基本数据类型 5.1.1 Boolean &#xff08;布尔型&#xff09; 5.1.1.1 …

Pytorch学习笔记 | 利用线性回归实现最简单的梯度下降 | 含代码和数据

代码 import torch import numpy as np import matplotlib.pyplot as plt import pandas as pddef make_linear_regression_data():x = np.linspace(start=10

IIC通讯故障纠错一例

1.问题描述 IIC在既有的工作中&#xff0c;用来协调两个外围芯片。一个芯片扩展IO&#xff0c;一个处理显示。仔细核对了IIC的种种配置&#xff0c;并且最终测量了输出的时钟和数据波形&#xff0c;最终的时钟线波形是这样的&#xff1a; 单片机master模式&#xff0c;输出前面…

ES6基础知识八:你是怎么理解ES6中Proxy的?使用场景?

一、介绍 定义&#xff1a; 用于定义基本操作的自定义行为 本质&#xff1a; 修改的是程序默认形为&#xff0c;就形同于在编程语言层面上做修改&#xff0c;属于元编程(meta programming) 元编程&#xff08;Metaprogramming&#xff0c;又译超编程&#xff0c;是指某类计算…

【Java练习题汇总】《第一行代码JAVA》异常处理篇,汇总Java练习题——异常的概念及处理标准格式(try、catch、finally、throws、throw)、断言机制 Assertion ~

Java练习题 异常处理篇 1️⃣ 异常处理篇 1️⃣ 异常处理篇 一、填空题 Throwable 下的两个子类是______________ 、______________ 。ArthmeticException 类表示______________ 异常&#xff0c; ArraysIndexOutOfBoundsException 表示______________ 异常。一个 try 代码后…

Linux内核提权漏洞(Dirty-pipe)复现

前言&#xff1a;CVE-2022-0847 是存在于 Linux内核 5.8 及之后版本中的本地提权漏洞。攻击者通过利用此漏洞&#xff0c;可覆盖重写任意可读文件中的数据&#xff0c;从而可将普通权限的用户提升到特权 root。 CVE-2022-0847 的漏洞原理类似于 CVE-2016-5195 脏牛漏洞&#xf…

Vue入门项目——WebApi

Vue入门——WebApi vue3项目搭建组合式API响应式APIreactive()ref() 生命周期钩子computed计算属性函数watch监听函数父子通信模板引用组合选项 vue3项目搭建 简单看下Vue3的优势吧 下载安装npm及node.js16.0以上版本&#xff08;确保安装成功可用如下代码检查版本&#xff0…

YOLOX-PAI 论文学习

1. 解决了什么问题&#xff1f; 对 YOLOX 做加速&#xff0c;在单张 Tesla V100 上取得了 42.8 42.8 42.8mAP&#xff0c;推理速度为 1 毫秒。 2. 提出了什么方法&#xff1f; 2.1 主干网络 YOLOv6 和 PP-YOLOE 都将主干网络从 CSPNet 切换到了 RepVGG。RepVGG 在推理时&a…

PHP在线相册--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库项目目录如图&#xff1a;代码部分&#xff1a;主页 配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

【深度学习】【Image Inpainting】Free-Form Image Inpainting with Gated Convolution

模型&#xff1a;DeepFillv2 (CVPR’2019) 论文&#xff1a;https://arxiv.org/abs/1806.03589 代码&#xff1a;https://github.com/JiahuiYu/generative_inpainting 文章目录 效果AbstractIntroductionRelated WorkAutomatic Image InpaintingGuided Image Inpainting and Sy…

KaiwuDB 资深解决方案专家周幸骏:打造核心时序引擎,释放数据新价值

以下为浪潮 KaiwuDB 资深解决方案专家周幸骏受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录摘要&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 01 聚焦“时序” 据 IDC 等权威数据统计&#xff0c;预估 2025 年物联网设备产生的数据可达到 79.4ZB &#xff1b;…

ubuntu与windows之间的文件共享

最近在做项目&#xff0c;需要用到ubuntu进行代码编译生成可执行文件&#xff0c;但是我个人阅读和编写代码喜欢用source insight这个软件IDE。安利一下这个软件&#xff0c;阅读代码和编辑代码真的很棒啊&#xff0c;谁用谁知道吧&#xff01; 由于在ubuntu中安装source insig…

ShardingJDBC - 学习笔记

一、简介 官网&#xff1a;Apache ShardingSphere 下载地址&#xff1a;下载 :: ShardingSphere 快速入门&#xff1a;ShardingSphere-JDBC :: ShardingSphere 分库分表框架 ShardingSphere包括Sharding-JDBC、Sharding-Proxy、Sharding-Sidecar三个开源分布式数据库中间件解…

每月被攻击4000万次,全球最不安全的关键基础设施实锤了

在当今不确定的地缘政治环境中&#xff0c;无论是个人还是企业都高度关注潜在的网络攻击。而这其中最令人担忧的是对关键基础设施和工业资产的攻击。 关键基础设施中尤其是电力、交通、通信、金融等系统均在现代社会中发挥着至关重要的作用&#xff0c;因此关键基础设施一直是…

程序员如何向老板提加薪?

今天的问题不仅适用于程序员&#xff0c;对于其他职业同样适用。如果你认为自己所做的工作应该得到更多的报酬&#xff0c;并且想为此做点什么&#xff0c;你有两个选择&#xff1a;找一个新的高薪工作或要求加薪。 这两种选择都会带来新的焦虑&#xff0c;但它们都会带来新的…

【框架篇】Spring Boot 配置文件(详细教程)

Spring Boot 配置文件 一&#xff0c;配置文件的用途 配置文件在Spring Boot项目中的地位是比较重要&#xff0c;其功能可主要归纳为以下几个&#xff1a; 进行配置程序属性&#xff1a;配置文件允许设置应用程序的各种属性&#xff0c;如数据库连接、端口号、日志级别、缓存…

多态及其原理

文章目录 构成多态的条件虚函数作用&#xff1a;完成重写 重写重载 重写 隐藏为什么析构函数要搞成符合多态?原理预热对于基类指针或引用指向父类或者子类的成员函数是如何调用不同的函数呢&#xff1f; 一个类如果是基类&#xff0c;它的析构函数最好加上virtual 构成多态的条…

【【51单片机的LCD1602 最简单的一集】】

最简单的一集&#xff0c;明白运算显示就没问题 这一节相对简单 其实只要明白显示行列就可以了 剩下来的取什么基本上就是遍历 然后读取到\0停止 下面是基础的LCD1602的功能 #include <REGX52.H> sbit LCD_RSP2^6; sbit LCD_RWP2^5; sbit LCD_EP2^7; #define LCD_Data…