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 都已经不是一个新事物了 ...
随机推荐
- 掌握Python文件操作:从基础到高阶的全方位探索
在本篇博客中,我们将全面.深入地探讨Python中的文件操作.文件操作在Python编程中是不可或缺的一部分,它包含了打开.读取.写入和关闭文件等各种操作.我们将从基础的文件操作讲解到高级的文件处理技 ...
- C/S架构和B/S架构两种数字孪生技术路线的区别是什么?
山海鲸创造了一种CS和BS热切换的编辑模式,即CSaaS架构,可以在安装软件之后一键从软件的CS状态切换为一个BS服务器,让私有化部署变得十分轻松.具体效果可以参照下面的视频: (https://ww ...
- 浅聊一下 C#程序的 内存映射文件 玩法
一:背景 1. 讲故事 前段时间训练营里有朋友问 内存映射文件 是怎么玩的?说实话这东西理论我相信很多朋友都知道,就是将文件映射到进程的虚拟地址,说起来很容易,那如何让大家眼见为实呢?可能会难倒很多人 ...
- rust cargo build一直出现 Blocking waiting for file lock on package cache
如果确定没有多个程序占用,可以删除rm -rf ~/.cargo/.package-cache,然后再执行
- JavaScript学习笔记 - 语法篇 - 一句废话没有版
写在前面: 绝不废话!放心食用 JavaScript语法很简单,可以直接在控制台调试理解 目录 1.变量和常量 2.数据类型 3.字符串 3.1 模板字符串 3.2 字符串的部分常用函数 4.数组 5 ...
- GO 集合 map 使用总结
转载请注明出处: Go语言的集合称为映射(map),它是一种无序的键值对(key-value)的集合,集合是通过键(key)来快速检索值(value)的,键(key)类似于索引,它指向值(value) ...
- 驱动开发:摘除InlineHook内核钩子
在笔者上一篇文章<驱动开发:内核层InlineHook挂钩函数>中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能 ...
- rocketmq-console基本使用
rocketmq-console基本使用 作用:rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能. 一.安装部署 下载rocketmq组件 rocketm ...
- 记一次 .NET 某工控视觉系统 卡死分析
一:背景 1. 讲故事 前段时间有位朋友找到我,说他们的工业视觉软件僵死了,让我帮忙看下到底是什么情况,哈哈,其实卡死的问题相对好定位,无非就是看主线程栈嘛,然后就是具体问题具体分析,当然难度大小就看 ...
- 分布式多协议接入网关FluxMQ-2.0功能说明
FluxMQ-2.0版本更新内容 前言 FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台.FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟 ...