JAVA实现单链表修改和删除数据节点

一、修改单链表中的一个节点

①实现思路

  1. 因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。
  2. 通过遍历链表,使辅助节点temp后移,找到要修改的节点。
  3. 然后进行修改操作。

②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

二、删除单链表中的一个节点

①实现思路

理论思路:

  1. 我们依旧要找一个辅助节点temp来进行节点代理操作,通过遍历链表,找到需要删除的这个节点的前一个节点,将temp指向该节点。
  2. 然后将待删除节点的后一个节点的引用赋值给待删除节点前一个节点的next域(temp.next=temp.next.next)
  3. 待删除的节点,将不会有其他引用指向,会被垃圾回收机制回收

图解思路:

②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实现单链表修改和删除数据节点的更多相关文章

  1. Java实现单链表的合并(保证数据的有序性)

    一.思路 1.比较两个链表的大小 2.将小链表插入到大链表中 3.使用插入保证链表数据的有序性 二.核心代码 /** * 合并两个链表,并且按照有序合并 * @param singleLinkedLi ...

  2. 面试之路(10)-BAT面试之java实现单链表的插入和删除

    链表的结构: 链表在空间是不连续的,包括: 数据域(用于存储数据) 指针域(用于存储下一个node的指针) 单项链表的代码实现: 节点类 构造函数 数据域的get,set方法 指针域的get,set方 ...

  3. Java如何大批量从json数据源中按指定符号隔字符串,并修改、删除数据

    原文出自:https://blog.csdn.net/seesun2012 package com.seesun2012.com; /** * Java大批量修改.删除数据,按指定标识符分隔字符串 * ...

  4. Java实现单链表的各种操作

    Java实现单链表的各种操作 主要内容:1.单链表的基本操作 2.删除重复数据 3.找到倒数第k个元素   4.实现链表的反转   5.从尾到头输出链表 6.找到中间节点 7.检测链表是否有环 8.在 ...

  5. 用Java实现单链表的基本操作

    笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...

  6. JAVA数据结构——单链表

    链表:一. 顺序存储结构虽然是一种很有用的存储结构,但是他有如下几点局限性:1. 因为创造线性表的时候已经固定了空间,所以当需要扩充空间时,就需要重新创建一个地址连续的更大的存储空间.并把原有的数据元 ...

  7. 使用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 ...

  8. java实现单链表的增删功能

    JAVA 实现单链表的增删功能 package linked; class LinkedTable{ } public class LinkedTableTest { public static vo ...

  9. 删除单链表倒数第n个节点

    基本问题 如何删除单链表中的倒数第n个节点? 常规解法 先遍历一遍单链表,计算出单链表的长度,然后,从单链表头部删除指定的节点. 代码实现 /** * * Description: 删除单链表倒数第n ...

  10. 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. 【C++ Primer】2.1 基本内置类型

    1. 基本内置类型 基本算数类型: 类型 含义 最小尺寸 bool 布尔类型 8bits char 字符 8bits wchar_t 宽字符 16bits char16_t Unicode字符 16b ...

  2. 基于生成式预训练Transformer的跨语言文本摘要与情感分析

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成 ...

  3. Java反射源码学习之旅

    1 背景 前段时间组内针对"拷贝实例属性是应该用BeanUtils.copyProperties()还是MapStruct"这个问题进行了一次激烈的battle.支持MapStru ...

  4. vCenter报错:Vmware vAPI Endpoint

    vCenter报错:Vmware vAPI Endpoint 问题现象: 平台警报1:设备管理运行状况警报 平台警报2:Vmware vAPI Endpoint服务运行状况警报 vcenter版本:v ...

  5. BeanDefinitionStoreException: Failed to read candidate component class

    ssm 整合时出现问题 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate ...

  6. Java扩展Nginx之三:基础配置项

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 经历了前面两篇的入门和编译源码之后,从本篇起 ...

  7. 【小小Demo】在线聊天小🌰子

    easy-chat 一个简单的即时通讯demo. 环境 jdk1.8 idea maven springboot 2.1.1.RELEASE websocket 项目启动 修改maven设置 打开ID ...

  8. PDF转换OFD(Java实用版)

    前言: 在项目中用到了,就写一下哈 OFD简介 百度百科:https://baike.baidu.com/item/OFD/56227163?fr=aladdin OFD(Open Fixed-lay ...

  9. zabbix 主动模式下报文分析

    获取监控项列表 客户端发起请求 3次握手之后,请求监控项列表: {"request":"active checks","host":&quo ...

  10. 20.1K Star!Notion的开源替代方案:AFFiNE

    Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记.今天给大家推荐一个最近比较火的开源替代方案:AFFiNE.目前该开源项目已经斩获20.1K Sta ...