JAVA实现单链表修改和删除数据节点
JAVA实现单链表修改和删除数据节点
一、修改单链表中的一个节点
①实现思路
- 因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。
- 通过遍历链表,使辅助节点temp后移,找到要修改的节点。
- 然后进行修改操作。
②updateNode代码实现
/**
* 修改节点的信息,根据id修改除id之外的节点信息,id是不能改变的
* 根据IdDataNode的id来修改
*
* @param idDataNode 待修改的数据节点
*/
public void updateNode(IdDataNode idDataNode) {
// 先判断链表是否为空
if (head.getNext() == null) {
System.out.println("链表为空");
}
// 定义辅助节点
IdDataNode temp = head.getNext();
// 标记是否找到了数据节点
boolean flag = false;
// 遍历找到要修改的数据节点
while (true) {
if (temp.getNext() == null) {
break;
}
if (temp.getId() == idDataNode.getId()) {
flag = true; // 说明找到这个编号为id的节点了
break;
}
temp = temp.getNext(); // 辅助节点后移
}
// 根据flag判断是否找到了要修改的节点
if (flag) {
temp.setData(idDataNode.getData());
} else {
System.out.println("没有找到等于这个节点的编号,修改失败!");
}
}
③updateNode方法测试-整体代码
说明:本次实验的整体测试代码是在《JAVA实现节点加入到单链表时按需求排序》一文实验代码上做出的updateNode方法增加。
/**
* ClassName: SingleLinkedListAddOrder
* Package: com.zhao.test
* Description:
*
* @Author XH-zhao
* @Create 2023/3/27 13:31
* @Version 1.0
*/
public class SingleLinkedListAddOrder {
// 创建单链表头节点
private IdDataNode head = new IdDataNode(0, "");
// 将数据节点按照数据id添加进链表
public void addByIdOrder(IdDataNode idDataNode) {
// 使用辅助变量temp代替head进行移动
IdDataNode temp = head;
while (true) {
// 说明temp走到了最后,必须要添加元素了(添加到最后)
if (temp.getNext() == null) {
break;
}
// temp节点的后一个节点的id比要添加节点的id大代表可以添加元素了
if (temp.getNext().getId() > idDataNode.getId()) {
break;
} else if (temp.getNext().getId() == idDataNode.getId()) {
System.out.println("您添加的元素已经存在了!!");
// 直接结束方法
return;
}
// 将temp元素后移(继续遍历)
temp = temp.getNext();
}
// 当遍历结束时,temp已经指向了要插入的位置的前一个节点(开始插入)
idDataNode.setNext(temp.getNext());
temp.setNext(idDataNode);
}
// 遍历整个链表
public void showLinkedListAll() {
// 当链表为空时不进行遍历,直接结束
if (head.getNext() == null) {
System.out.println("链表为空");
return;
}
// 遍历链表时同样需要辅助变量,因为head节点不能移动,否则就找不到该链表了
IdDataNode temp = head;
while (true) {
// 当链表为空时,不进行遍历,直接结束循环
if (temp.getNext() == null) {
break;
}
// 直接输出链表节点存的数据
System.out.println(temp.getNext());
//将temp指针往后移动
temp = temp.getNext();
}
}
/**
* 修改节点的信息,根据id修改除id之外的节点信息,id是不能改变的
* 根据IdDataNode的id来修改
*
* @param idDataNode 待修改的数据节点
*/
public void updateNode(IdDataNode idDataNode) {
// 先判断链表是否为空
if (head.getNext() == null) {
System.out.println("链表为空");
}
// 定义辅助节点
IdDataNode temp = head.getNext();
// 标记是否找到了数据节点
boolean flag = false;
// 遍历找到要修改的数据节点
while (true) {
if (temp.getNext() == null) {
break;
}
if (temp.getId() == idDataNode.getId()) {
flag = true; // 说明找到这个编号为id的节点了
break;
}
temp = temp.getNext(); // 辅助节点后移
}
// 根据flag判断是否找到了要修改的节点
if (flag) {
temp.setData(idDataNode.getData());
} else {
System.out.println("没有找到等于这个节点的编号,修改失败!");
}
}
}
// 带ID的数据节点类
class IdDataNode {
private int id; // 用来作为排序依据,即实现以id进行排序的单链表
private String data; // data域,要存储的数据
private IdDataNode next; // next域,用于指向下一个数据节点地址
// 数据节点构造器
public IdDataNode(int id, String data) {
this.id = id;
this.data = data;
}
@Override
public String toString() {
return "IdDataNode{" +
"id=" + id +
", data='" + data + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public IdDataNode getNext() {
return next;
}
public void setNext(IdDataNode next) {
this.next = next;
}
}
// 更新节点数据测试类
class SingleLinkedListUpdateNodeTest {
public static void main(String[] args) {
// 创建四个数据节点,id分别是1-2-3-4
IdDataNode dataNode1 = new IdDataNode(1, "data1");
IdDataNode dataNode2 = new IdDataNode(2, "data2");
IdDataNode dataNode3 = new IdDataNode(3, "data3");
IdDataNode dataNode4 = new IdDataNode(4, "data4");
// 创建带头节点的单链表
SingleLinkedListAddOrder singleLinkedListAddOrder = new SingleLinkedListAddOrder();
// 将四个数据节点增添到链表当中
singleLinkedListAddOrder.addByIdOrder(dataNode1);
singleLinkedListAddOrder.addByIdOrder(dataNode2);
singleLinkedListAddOrder.addByIdOrder(dataNode3);
singleLinkedListAddOrder.addByIdOrder(dataNode4);
IdDataNode dataNode1_update = new IdDataNode(1, "data1_被修改");
IdDataNode dataNode5_update = new IdDataNode(5, "data5_被修改");
singleLinkedListAddOrder.updateNode(dataNode1_update);
singleLinkedListAddOrder.updateNode(dataNode5_update);
System.out.println("***************************************");
// 显示链表中元素,查看数据是否被修改
singleLinkedListAddOrder.showLinkedListAll();
}
}
④测试结果
没有找到等于这个节点的编号,修改失败!
***************************************
IdDataNode{id=1, data='data1_被修改'}
IdDataNode{id=2, data='data2'}
IdDataNode{id=3, data='data3'}
IdDataNode{id=4, data='data4'}
进程已结束,退出代码0
二、删除单链表中的一个节点
①实现思路
理论思路:
- 我们依旧要找一个辅助节点temp来进行节点代理操作,通过遍历链表,找到需要删除的这个节点的前一个节点,将temp指向该节点。
- 然后将待删除节点的后一个节点的引用赋值给待删除节点前一个节点的next域(temp.next=temp.next.next)
- 待删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
图解思路:

②deleteNode代码实现
// 删除节点
public void deleteNode(IdDataNode idDataNode) {
// 先判断链表是否为空
if (head.getNext() == null) {
System.out.println("链表为空");
}
// 使用辅助节点temp来进行节点代理操作
IdDataNode temp = head;
boolean flag = false; // 标识是否找到删除节点的上一个节点
while(true) {
if(temp.getNext() == null) {
break;
}
if(temp.getNext() == idDataNode){
// 找到了要删除节点的上一个节点了,此时temp代理该节点
flag = true;
break;
}
temp = temp.getNext(); // 辅助节点后移
}
if(flag) {
temp.setNext(temp.getNext().getNext()); // 然后将待删除节点的后一个节点的引用赋值给待删除节点前一个节点的next域
}else {
System.out.println("没有找到要删除的节点!");
}
}
③deleteNode方法测试-整体代码
/**
* ClassName: SingleLinkedListAddOrder
* Package: com.zhao.test
* Description:
*
* @Author XH-zhao
* @Create 2023/3/27 13:31
* @Version 1.0
*/
public class SingleLinkedListAddOrder {
// 创建单链表头节点
private IdDataNode head = new IdDataNode(0, "");
// 将数据节点按照数据id添加进链表
public void addByIdOrder(IdDataNode idDataNode) {
// 使用辅助变量temp代替head进行移动
IdDataNode temp = head;
while (true) {
// 说明temp走到了最后,必须要添加元素了(添加到最后)
if (temp.getNext() == null) {
break;
}
// temp节点的后一个节点的id比要添加节点的id大代表可以添加元素了
if (temp.getNext().getId() > idDataNode.getId()) {
break;
} else if (temp.getNext().getId() == idDataNode.getId()) {
System.out.println("您添加的元素已经存在了!!");
// 直接结束方法
return;
}
// 将temp元素后移(继续遍历)
temp = temp.getNext();
}
// 当遍历结束时,temp已经指向了要插入的位置的前一个节点(开始插入)
idDataNode.setNext(temp.getNext());
temp.setNext(idDataNode);
}
// 遍历整个链表
public void showLinkedListAll() {
// 当链表为空时不进行遍历,直接结束
if (head.getNext() == null) {
System.out.println("链表为空");
return;
}
// 遍历链表时同样需要辅助变量,因为head节点不能移动,否则就找不到该链表了
IdDataNode temp = head;
while (true) {
// 当链表为空时,不进行遍历,直接结束循环
if (temp.getNext() == null) {
break;
}
// 直接输出链表节点存的数据
System.out.println(temp.getNext());
//将temp指针往后移动
temp = temp.getNext();
}
}
/**
* 修改节点的信息,根据id修改除id之外的节点信息,id是不能改变的
* 根据IdDataNode的id来修改
*
* @param idDataNode 待修改的数据节点
*/
public void updateNode(IdDataNode idDataNode) {
// 先判断链表是否为空
if (head.getNext() == null) {
System.out.println("链表为空");
}
// 定义辅助节点
IdDataNode temp = head.getNext();
// 标记是否找到了数据节点
boolean flag = false;
// 遍历找到要修改的数据节点
while (true) {
if (temp.getNext() == null) {
break;
}
if (temp.getId() == idDataNode.getId()) {
flag = true; // 说明找到这个编号为id的节点了
break;
}
temp = temp.getNext(); // 辅助节点后移
}
// 根据flag判断是否找到了要修改的节点
if (flag) {
temp.setData(idDataNode.getData());
} else {
System.out.println("没有找到等于这个节点的编号,修改失败!");
}
}
// 删除节点
public void deleteNode(IdDataNode idDataNode) {
// 先判断链表是否为空
if (head.getNext() == null) {
System.out.println("链表为空");
}
// 使用辅助节点temp来进行节点代理操作
IdDataNode temp = head;
boolean flag = false; // 标识是否找到删除节点的上一个节点
while(true) {
if(temp.getNext() == null) {
break;
}
if(temp.getNext() == idDataNode){
// 找到了要删除节点的上一个节点了,此时temp代理该节点
flag = true;
break;
}
temp = temp.getNext(); // 辅助节点后移
}
if(flag) {
temp.setNext(temp.getNext().getNext()); // 然后将待删除节点的后一个节点的引用赋值给待删除节点前一个节点的next域
}else {
System.out.println("没有找到要删除的节点!");
}
}
}
// 带ID的数据节点类
class IdDataNode {
private int id; // 用来作为排序依据,即实现以id进行排序的单链表
private String data; // data域,要存储的数据
private IdDataNode next; // next域,用于指向下一个数据节点地址
// 数据节点构造器
public IdDataNode(int id, String data) {
this.id = id;
this.data = data;
}
@Override
public String toString() {
return "IdDataNode{" +
"id=" + id +
", data='" + data + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public IdDataNode getNext() {
return next;
}
public void setNext(IdDataNode next) {
this.next = next;
}
}
// 删除节点数据测试类
class SingleLinkedListDeleteNodeTest {
public static void main(String[] args) {
// 创建四个数据节点,id分别是1-2-3-4
IdDataNode dataNode1 = new IdDataNode(1, "data1");
IdDataNode dataNode2 = new IdDataNode(2, "data2");
IdDataNode dataNode3 = new IdDataNode(3, "data3");
IdDataNode dataNode4 = new IdDataNode(4, "data4");
// 创建带头节点的单链表
SingleLinkedListAddOrder singleLinkedListAddOrder = new SingleLinkedListAddOrder();
// 将四个数据节点增添到链表当中
singleLinkedListAddOrder.addByIdOrder(dataNode1);
singleLinkedListAddOrder.addByIdOrder(dataNode2);
singleLinkedListAddOrder.addByIdOrder(dataNode3);
singleLinkedListAddOrder.addByIdOrder(dataNode4);
IdDataNode dataNode5_delete = new IdDataNode(5, "data5");
singleLinkedListAddOrder.deleteNode(dataNode1);
singleLinkedListAddOrder.deleteNode(dataNode5_delete);
System.out.println("***************************************");
// 显示链表中元素,查看数据是否被修改
singleLinkedListAddOrder.showLinkedListAll();
}
}
④测试结果
没有找到要删除的节点!
***************************************
IdDataNode{id=2, data='data2'}
IdDataNode{id=3, data='data3'}
IdDataNode{id=4, data='data4'}
进程已结束,退出代码0
三、实验总结
通过以上实验,我们实现了单链表修改和删除数据节点的操作。
JAVA实现单链表修改和删除数据节点的更多相关文章
- Java实现单链表的合并(保证数据的有序性)
一.思路 1.比较两个链表的大小 2.将小链表插入到大链表中 3.使用插入保证链表数据的有序性 二.核心代码 /** * 合并两个链表,并且按照有序合并 * @param singleLinkedLi ...
- 面试之路(10)-BAT面试之java实现单链表的插入和删除
链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...
- Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据
原文出自:https://blog.csdn.net/seesun2012 package com.seesun2012.com; /** * Java大批量修改.删除数据,按指定标识符分隔字符串 * ...
- Java实现单链表的各种操作
Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素 4.实现链表的反转 5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...
- 用Java实现单链表的基本操作
笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...
- JAVA数据结构——单链表
链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...
- 使用java实现单链表(转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html)
使用java实现单链表----(java中的引用就是指针)转载自:https://www.cnblogs.com/zhongyimeng/p/9945332.html ? 1 2 3 4 5 6 7 ...
- java实现单链表的增删功能
JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...
- 删除单链表倒数第n个节点
基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
http://www.cnblogs.com/yukaizhao/archive/2010/05/13/linq_to_sql_1.html LINQ和 LINQ to SQL 都已经不是一个新事物了 ...
随机推荐
- 强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-常见问题和面试必知必答[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.强化学习核心概念 强化学习(reinforcement le ...
- linux 服务器上查看日志的几种方式
1.tail命令:tail -f filename 可以动态的查看日志的输出内容. 查看文件的最后几行,默认是10行,但是可以通过-n 参数来指定要查看的行数. 例如tail -n ...
- 数据库varchar和tinyint和int和java实体属性的对应关系的学习
大家好,最近做项目碰到群里小伙伴的对于项目中用到的这几个类型,自己的java实体类属性该用什么类型干到困惑,于是乎,我决定为大家解密! 相信我,绝对干货,看完了,工资+200~哈哈哈,扯远了,闲话不对 ...
- PHP检查更新加载本地版本号并解压覆盖
<?phperror_reporting(0);ob_implicit_flush(true);$begin = microtime(true);//检查更新,加载本地版本号$config = ...
- 记一次 .NET 某游戏服务后端 内存暴涨分析
一:背景 1. 讲故事 前几天有位朋友找到我,说他们公司的后端服务内存暴涨,而且CPU的一个核也被打满,让我帮忙看下怎么回事,一般来说内存暴涨的问题都比较好解决,就让朋友抓一个 dump 丢过来,接下 ...
- 处理.git文件夹过大出现臃肿问题-filter-branch和BFG工具
Git开发手册 git一些不常用的命令记不住,可以查看git开发手册(https://m.php.cn/manual/view/34957.html) 1..git/objects/pack 文件过大 ...
- FireflySoft.LeaderElection增加基于ZooKeeper的Leader选举
FireflySoft.LeaderElection的第一个版本实现了基于Consul的Leader选举,考虑到ZooKeeper的一个常见用途也是选主,所以此类库把ZooKeeper也集成了进来.并 ...
- vue+element 判断table表格输入不能为空
点击确定的时候,判断表格其中某行某值不能为空 1.HTML <div class="app-container"> <el-form ref="form ...
- clickhouse 与 zookeeper
目录 clickhouse 设置中的 zookeeper 配置 参数说明 配置示例 [预发生产] ClickHouse Keeper 四字母命令 clickhouse 设置中的 zookeeper 配 ...
- SpringBoot3基础用法
目录 一.背景 二.环境搭建 1.工程结构 2.框架依赖 3.环境配置 三.入门案例 1.测试接口 2.全局异常 3.日志打印 3.1 日志配置 3.2 日志打印 四.打包运行 五.参考源码 技术和工 ...