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 都已经不是一个新事物了 ...
随机推荐
- uniapp主题切换功能的方式终结篇(全平台兼容)
前面我已经给大家介绍了两种主题切换的方式,每种方式各有自己的优势与缺点,例如"scss变量+vuex"方式兼容好但不好维护与扩展,"scss变量+require" ...
- 【Photoshop】切图保存小坑(选择png格式得到gif问题)
默认情况下:Photoshop 导出切片为[GIF]格式 当你很嗨皮的把[GIF]调整为[PNG]或[JPG]格式,并保存时: 你会发现,自己的图片格式莫名其妙还是[GIF]: 但,我们的期望是: 原 ...
- Kubernetes使用Harbor作为私有镜像仓库
概述 Harbor使用了基于角色的访问控制策略,当从Harbor中拉去镜像的时候,首先要进行身份认证,认证通过后才可以拉取镜像.在命令行模式下,需要先执行docker login,登陆成功后,才可以d ...
- 【Netty】一个RPC实例
Netty实现简易RPC调用 总体流程: 客户端发起rpc调用请求,封装好调用的接口名,函数名,返回类型,函数参数类型,函数参数值等属性,将消息发送给服务器. 服务器的handler解析rpc请求,调 ...
- CF1810G The Maximum Prefix
经典套路. 题意 你将随机生成一个长度为 \(k\) 的数组 \(a\),其中 \(a_i\) 有 \(p_i\) 概率为 \(1\),否则为 \(-1\).定义其前缀和数组 \(s_i = \sum ...
- DevChat:将 GPT-4 无缝融入 VS Code,极致提升你的编程体验
目录 一.絮絮叨叨 1.1 缘起 1.2 嫌弃 1.3 征服 二.认真聊聊 2.1 老板给了少年一个任务 2.2 少年祭出了 DevChat 2.3 让 DevChat 帮着选 web 框架 2.4 ...
- ThinkPHP6.0 链式SQL语句
ThinkPHP6.0 链式SQL语句 查询单个数据 $user = Db::query('select * from `user`'); $user=Db::table('user')->wh ...
- go web学习(五)
跟着刘旭老师学go web做的笔记 [Go Web 编程快速入门[Golang/Go语言](完结)] https://www.bilibili.com/video/BV1Xv411k7Xn/?p=27 ...
- DHorse v1.2.1 发布,基于k8s的发布平台
综述 DHorse是一个简单易用.以应用为中心的云原生DevOps系统,具有持续集成.持续部署.微服务治理等功能,无需安装依赖Docker.Maven.Node等环境即可发布Java.Vue.Reac ...
- 求任意两个正整数的最大公约数(GCD)。
问题描述 求任意两个正整数的最大公约数(GCD). 问题分析 如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数.几个自然数公有的约数,叫做这几个自然数的公约数.公约数中最大的一个公约 ...