java 实现删除单链表中所有指定的结点以及如何清空单链表

2023-10-26


1. 删除单链表中的所有的指定结点

1.1 删除思路

  • 定义一个 cur 来代替 head 遍历单链表。
  • 遇到指定结点就开始删除。
  • 是不是要删除的结点, cur 都指向下一个结点,直到表遍历完成。
  • 单链表中可能没有要删除的结点。
  • 定义一个 prev 指向要删除结点的前驱。
  • 如果单链表的第一个结点就是要删除的结点,直接将这个结点指向后驱。

1.2 删除步骤

1.2.1 删除结点不是头结点

  1. 定义 cur 从表的第二个结点开始遍历。
    定义 prev 从表的 cur 的前驱位置开始遍历。

    比较此时 cur 指向结点的值是不是要删除结点的值。
    是就改指向删除,不是就 cur 往后面找。

  2. 现在要删除的是,值是2的结点。
    cur 此时指向了要删除的结点,进行改指向删除。

    可以看到第一个节点直接指向了第三个节点。

  3. cur 指向下一个,prev 指向 cur 的前驱。

    第一个节点存的是第三个节点的地址,也就与第二个结点断开了。
    prev 此时不需要移动即是 cur 的前驱。
    比较此时 cur 指向结点的值是不是要删除结点的值。
    是就改指向删除,不是就 cur 往后面找。

  4. 比较此时 cur 指向结点的值是不是要删除结点的。

    此时的第一个结点的地址域存的是最后一个结点的地址,也就指向了它。

  5. cur 往后走,prev 指向cur的前驱。

    此时 cur 指向结点的值不是要删除的结点,cur指向下一个结点。

    此时 cur 为空 遍历结束,跳出循环。所有的要删除的结点都已删除完毕。

1.2.2 删除的结点是头结点的情况

如果头结点是要删除的结点,若按照上面的方法删除;
遍历结束后,头结点是未删除的。


可以看到此时 cur 为空了,但是还有一个结点未删除。


解决办法:

判断一下头结点是不是要删除的结点。

判断方法:

  • 将头节点与要删除的结点的值比较,看看是不是相等。
  • 如果使得话,就直接将头结点指向它的后区即可。

删除后:

1.3 部分代码思路分析

  1. 如果表是空的直接返回
 //链表中可能是空的
 if(this.head == null) {
     return;
 }
  1. 定义cur 和 prev
  ListNode cur = this.head.next;//cur指向要删除的结点
  ListNode prev = this.head;//prev指向要删除结点的前驱
  1. 该结点指向代码
prev.next = cur.next;//要删除结点的前驱的地址域指向key结点的后驱的地址域
cur = cur.next;//要删除的结点指向它的后驱
  1. 判断头结点是不是要删除的结点的代码
if (this.head.value == key) {
    this.head = this.head.next;//将这个头结点指向它的后驱 - 然后就删除了
}

1.4 整体代码演示

//删除所有key的结点
public void removeAllKey(int key) {
    //链表中可能是空的
    if(this.head == null) {
        return;
    }

    ListNode cur = this.head.next;//cur指向要删除的结点
    ListNode prev = this.head;//prev指向要删除结点的前驱
    //cur不等于空则说明cur未找到尾结点,移动要继续
    while (cur != null) {
       //如果当前的cur指向的数据是我要找的key
       if (cur.value == key) {
           //改变指向删除
           prev.next = cur.next;//要删除结点的前驱的地址域指向key结点的后驱的地址域
           cur = cur.next;//要删除的结点指向它的后驱
       }else{ //若不是要找的 - 跳到下一个结点
           prev = cur;//当前cur结点的前驱指向cur指向的结点
           cur = cur.next;//当前cur结点指向它的后驱
       }
   }
   //如果链表的第一个结点是key
   if (this.head.value == key) {
       this.head = this.head.next;//将这个头结点指向它的后驱 - 然后就删除了
   }
}

2. 清空单链表

释放单链表中每一个结点的对象,直接置为空即可。

代码演示:

public void clear() {
   this.head = null;//将的结点置为空
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 实现删除单链表中所有指定的结点以及如何清空单链表 的相关文章

随机推荐

  • 【无标题】PAT作业1001 害死人不偿命的(3n+1)猜想

    题目要求简要概述 输入一个小于1000的正整数 如果该正整数为奇数 进行2 n的运算 如果为偶数 进行 3n 1 2的运算 反复进行计算 直至n 1后 输出运算的次数 解题方法 1 定义两个整形变量 分别用于输入n 记录运算次数 int n
  • 将压缩包里的图片显示到页面上示例

    在做项目的时候有个这样的需求 需要把压缩包里的图片预览显示出来 梳理一下就以下三步 下载压缩包 解压出文件 组成可用的图片URL 显示到图片标签上 实现这个功能过程还是走了些弯路的 也遇到一些坑 这里就不多废话了 直接上代码 希望能帮助各位
  • SVPWM所需要掌握的一些定理

    1 正弦定理 2 伏秒平衡 不懂 伏秒平衡 又称伏秒平衡 是指开关电源稳定工作状态下 加在电感两端的电压乘以导通时间等于关断时刻电感两端电压乘以关断时间 或指在稳态工作的开关电源中电感两端的正伏秒值等于负伏秒值 在SVPWM中 磁链等于电压
  • ORB-SLAM2第二节---双目地图初始化

    比起单目初始化 而双目实现地图的初始化非常简单 只需要一帧 左右目图像 即可完成初始化 行特征点统计 考虑用图像金字塔尺度作为偏移量 在当前点上下正负偏移量 r 内的纵坐标值都认为是匹配点可能存在的行数 之所以这样做 是因为极线矫正后仍然存
  • 创建steam账户反复人机验证_您必须先通过人机验证才能创建steam帐户怎么办

    展开全部 在注册steam帐户遇到提示必须通过人机验证才能创建62616964757a686964616fe4b893e5b19e31333433643062提示时 勾选注册页面中的进行人机验证 在人机身份验证界面中点击需要的图片并按照步骤
  • socket接收报错

    首先是没得到正确错误号 是因为windows平台WSAGetLastError得过之后就没了 所以需要int变量保存一下 发现错误号后知道是最后一个参数没有初始化复制 bzero buf sizeof buf bzero cli adr s
  • PostgreSQL 多表关联删除

    用PostgreSQL数据库删除某个表数据 student 需要关联多个表 如classroom 作为条件 以下语句走不通 delete s from student s classroom c where s cid c id and s
  • JPA基本数据类型映射

    Employ author Administrator Entity Table name T EMPLOY SequenceGenerator name SEQ sequenceName SEQ SYS FUNC MENU initial
  • 利用MATLAB编写一段表格数据处理并作图

    使用MATLAB处理表格数据并作图可以使用以下步骤 读入表格数据 使用readtable或者xlsread函数读入Excel或者其他格式的表格数据 数据预处理 使用MATLAB的数组运算和统计函数对读入的数据进行预处理 包括清洗缺失值 去除
  • hadoopRPC的使用

    1模拟namenode的查询元数据 public interface ClientNamenodeProtocol public static final long versionID 1L 会读取这个版本号 但可以和客户端的不一样 没有校
  • 【数据结构】树(五)—— 二叉排序树(C语言版)

    数据结构 二叉排序树 C语言版 前言 一 二叉排序树的定义 二 二叉排序树的性质 三 二叉排序树的操作 1 二叉排序树常用存储结构 2 二叉排序树的查找 递归实现 查找 二叉树T 中键值为 key 的节点 非递归实现 查找 二叉树T 中键值
  • java中sum是什么_Java中的IntStream sum()方法

    sum Java中使用IntStream类的方法返回此流中元素的总和 语法如下 int sum 要使用Java中的IntStream类 请导入以下包 import java util stream IntStream 创建IntStream
  • 不知道华为手机识别图片文字怎么弄?2个识别方法收好了

    我们有时候会将书籍上的内容拍照下来进行抄写 但是面对大段的文字 手动抄写会比较花费时间 其实我们可以进行手机识别图片文字 一键进行文字内容提取 这样就方便多了 那你们知道华为手机识别图片文字怎么弄吗 下面我就来分享两个手机识别的方法给大家
  • python安装pip

    pip python2 安装 wget https bootstrap pypa io 2 6 get pip py python2 get pip py pip V pip3 python3 安装 wget https bootstrap
  • 攻防世界PWN新手练习区——cgpwn2

    攻防世界PWN新手练习区 cgpwn2 首先检查文件的有哪些保护 checksec cgpwn2 32位程序 用IDA反编译文件 main函数中只有hello函数 点击查看 整个函数看起来是在进行某种算法 但关键点在于return gets
  • 计算机的起源与发展(概述+习题)

    概述 计算机 computer 也称为 电脑 是一种具有计算功能 记忆功能和逻辑判断功能的机器设备 它能接收数据 保存数据 按照预定的程序对数据进行处理 并提供和保存处理结果 计算机的起源 图灵机 图灵机是一种抽象的计算模型 并没有真正地生
  • H3CNE综合实验

    H3CNE综合实验 实验拓扑 实验需求 按照图示配置IP地址 SW1和SW2之间的直连链路配置链路聚合 公司内部业务网段为Vlan10和Vlan20 Vlan10是市场部 Vlan20是技术部 要求对Vlan 进行命名以便识别 PC1属于V
  • python实现星空效果

    以前用DEV C 这个编译器时 看过easyx 这个C 图形库 文档中有范例程序 是模拟星空的 觉得的不错 今天有空 把Crossin用python写的一个雪花模拟程序 修改了一下 效果和easyx的基本一模一样 使用easyx的 代码 编
  • GMT、UTC与24时区 等时间概念

    许多人都知道两地时间表简称为GMT或UTC 而世界时区表则通称为World Time 那么GMT与UTC的实质原意又是为何 世界时区又是怎么区分的 面盘上密密麻麻的英文单字代表着什么意义与作用呢 这些都是新手在接触两地时间表或世界时区表时
  • java 实现删除单链表中所有指定的结点以及如何清空单链表

    文章目录 1 删除单链表中的所有的指定结点 1 1 删除思路 1 2 删除步骤 1 2 1 删除结点不是头结点 1 2 2 删除的结点是头结点的情况 1 3 部分代码思路分析 1 4 整体代码演示 2 清空单链表 1 删除单链表中的所有的指