【数据结构】单链表的增删改查

介绍

链表是有序的列表,但是它在内存中是如下存储的:

①链表以节点的方式进行存储,是链式存储的

②每个节点包含 data 域、next 域:指向下一节点

③链表的各个节点不一定是连续存放的

④链表分为有头节点的链表和没有头节点的链表 

head节点

1.不存放具体数据

2.作用就是表示单链表头

一、将英雄直接添加到链表尾部
public class SingleLinkedListDemo {public static void main(String[] args) {//进行一个测试//先创建节点HeroNode heroNode1 = new HeroNode(1, "孙悟空", "大圣");HeroNode heroNode2 = new HeroNode(2, "猪八戒", "老猪");HeroNode heroNode3 = new HeroNode(3, "沙悟净", "沙和尚");HeroNode heroNode4 = new HeroNode(4, "唐三藏", "唐僧");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();//加入singleLinkedList.add(heroNode1);singleLinkedList.add(heroNode2);singleLinkedList.add(heroNode3);singleLinkedList.add(heroNode4);//显示一把singleLinkedList.list();}
}//定义StringLinkedList 管理我们的英雄
class SingleLinkedList {//先初始化一个头节点,头节点不要动,不存放具体的数据private HeroNode head = new HeroNode(0, "", "");//添加节点到单向链表/*思路:当不考虑编号顺序时1.找到当前链表的最后节点2.将最后这个节点的next 指向 新的节点*/public void add(HeroNode heroNode) {//因为head节点不能动,因此我们需要一个辅助变量 tempHeroNode temp = head;//遍历链表,找到最后while (true) {//找到链表的最后if (temp.next == null) {break;}//如果没有找到链表的最后temp = temp.next;}//当退出while循环时,temp就指向了链表的最后temp.next = heroNode;}//显示链表【遍历】public void list() {//判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}//因为头节点不能动,因此我们需要一个辅助节点来遍历HeroNode temp = head.next;while (true) {//输出节点信息System.out.println(temp);//判断是否到链表最后if (temp.next == null) {break;}//将temp后移,一定小心,否则是死循环temp = temp.next;}}
}//定义一个HeroNode,每个HeroNode 对象就是一个节点
class HeroNode {public int no;public  String name;public String nickname;public HeroNode next;  //指向下一节点//构造器public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,我们重写toString方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}
二、将英雄按照排名插入到链表中

1.首先找到新添加的节点的位置,通过辅助指针完成

2.新节点.next = temp.next

3.temp.next = 新节点

public class SingleLinkedListDemo {public static void main(String[] args) {//进行一个测试//先创建节点HeroNode heroNode1 = new HeroNode(1, "孙悟空", "大圣");HeroNode heroNode2 = new HeroNode(2, "猪八戒", "老猪");HeroNode heroNode3 = new HeroNode(3, "沙悟净", "沙和尚");HeroNode heroNode4 = new HeroNode(4, "唐三藏", "唐僧");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();//加入
//        singleLinkedList.add(heroNode1);
//        singleLinkedList.add(heroNode2);
//        singleLinkedList.add(heroNode3);
//        singleLinkedList.add(heroNode4);//按照编号的顺序加入singleLinkedList.addByOrder(heroNode4);singleLinkedList.addByOrder(heroNode1);singleLinkedList.addByOrder(heroNode3);singleLinkedList.addByOrder(heroNode2);//显示一把singleLinkedList.list();}
}//定义StringLinkedList 管理我们的英雄
class SingleLinkedList {//先初始化一个头节点,头节点不要动,不存放具体的数据private HeroNode head = new HeroNode(0, "", "");//添加节点到单向链表/*思路:当不考虑编号顺序时1.找到当前链表的最后节点2.将最后这个节点的next 指向 新的节点*/public void add(HeroNode heroNode) {//因为head节点不能动,因此我们需要一个辅助变量 tempHeroNode temp = head;//遍历链表,找到最后while (true) {//找到链表的最后if (temp.next == null) {break;}//如果没有找到链表的最后temp = temp.next;}//当退出while循环时,temp就指向了链表的最后temp.next = heroNode;}//第二种添加英雄的方式/*根据排名将英雄插入到指定位置如果有这个排名,则添加失败,并给出提示*/public void addByOrder(HeroNode heroNode) {//因为头节点不能动,因此我们仍然通过一个辅助指针来帮助找到添加的位置//因为单链表,因此我们找的 temp 是位于添加位置的前一个节点,否则无法插入HeroNode temp = head;boolean flag = false; //flag标识添加的编号是否存在,默认为 falsewhile (true) {if (temp.next == null) {  //说明 temp 已经在链表的最后break;}if (temp.next.no > heroNode.no) {break;} else if (temp.next.no == heroNode.no) {flag = true;  //说明编号存在break;}temp = temp.next;  //后移,遍历当前链表}//判断 flag 的值if (flag) {  //不能添加,说明编号存在System.out.printf("准备插入的英雄编号%d已经存在,不能加入\n", heroNode.no);} else {  //插入到链表中,temp的后面heroNode.next = temp.next;temp.next = heroNode;}}//显示链表【遍历】public void list() {//判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}//因为头节点不能动,因此我们需要一个辅助节点来遍历HeroNode temp = head.next;while (true) {//输出节点信息System.out.println(temp);//判断是否到链表最后if (temp.next == null) {break;}//将temp后移,一定小心,否则是死循环temp = temp.next;}}
}//定义一个HeroNode,每个HeroNode 对象就是一个节点
class HeroNode {public int no;public  String name;public String nickname;public HeroNode next;  //指向下一节点//构造器public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,我们重写toString方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}
 三、修改节点的信息
//修改节点的信息,根据编号修改,即编号不能改public void update(HeroNode newHeroNode) {//判断是否空if (head.next == null) {System.out.println("链表为空");return;}//根据编号,找到需要修改的节点//定义一个辅助变量HeroNode temp = head.next;boolean flag = false;  //表示是否找到该节点while (true) {if (temp == null) {break; //已经遍历完链表}if (temp.no == newHeroNode.no) {//找到flag = true;break;}temp = temp.next;}//根据flag 判断是否找到要修改的节点if (flag) {temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;} else {  //没有找到System.out.printf("没有找到编号为%d的节点,不能修改\n", newHeroNode.no);}}
四、删除节点

从单链表中删除一个节点的思路

1.我们先找到需要删除的节点的前一个节点 temp

2.temp.next = temp.next,next

3.被删除的节点将不会有其他的引用指向,会被垃圾回收机制回收

//删除节点/*思路1.head不能动,因此我们需要一个 temp 辅助节点找到待删除节点的前一个节点2.说明:我们在比较时,是 temp.next.no 和 需要删除节点.no 比较*/public void del(int no) {HeroNode temp = head;boolean flag = false;  //标识是否找到while (true) {if (temp.next == null) {break;}if (temp.next.no == no) {//找到了待删除节点的前一个节点flag = true;break;}temp = temp.next;}//判断flagif (flag == true) {  //找到了temp.next = temp.next.next;} else {  //没找到System.out.printf("编号为%d的节点不存在", no);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1487995.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

比肩 GPT-4o 的 Llama 3.1 本地部署快速体验的方法

比肩 GPT-4o 的 Llama 3.1 本地部署快速体验的方法 flyfish Llama 3.1模型简介 Llama 3.1是一系列大型语言模型,包含以下几种规模: 8B 参数:模型中有80亿个参数 70B 参数:模型中有700亿个参数 405B 参数:模型中有4…

深入理解MySQL锁机制与性能优化:详解记录锁、间隙锁、临键锁及慢SQL查询分析

1. 事务隔离和锁机制详解 记录锁 第一种情况,当我们对于唯一性的索引(包括唯一索引和主键索引)使用等值查询,精准匹配到一条记录的时候,这个时候使用的就是记录锁。 比如 where id = 1 4 7 10。 间隙锁 第二种情况,当我们查询的记录不存在,无论是用等值查询还是范围…

【vue教程】四. Vue 计算属性和侦听器

目录 本章涵盖知识点回顾计算属性(Computed)创建计算属性计算属性的多样性计算属性的数组过滤计算属性的复杂表达式 计算属性 vs 方法计算属性的实例演示 侦听器(Watchers)创建侦听器侦听器的高级用法侦听器的深度观察侦听器的立即…

无线遥控控制直流电机和无刷电机开关

一 目的 此文章记录了arduino与陶晶驰串口屏实现联动,点击屏幕双态开关远程控制arduino2560板载的直流电机和无刷电机开关。为手搓乒乓球发球机做准备。 二 接线 2.1串口屏接线 串口屏与Arduino UNO接线如下: ———————————————— RX …

pdf2image:将PDF文档转化为图像的Python魔法

标题:探索pdf2image:将PDF文档转化为图 像的Python魔法 背景 在数字时代,我们经常需要处理各种格式的文档,尤其是PDF文件。PDF以其跨平台的可读性和稳定性而广受欢迎。然而,有时我们需要将PDF文件转换成图像格式&am…

C++ - char*、const char*、char[]、string

const char* const char* 用来定义字符串常量。 char[ ] char型的字符数组是一种定长的数组,存储指定长度的字符序列,数组中的每个元素都是一个char类型的变量,如: char arr[] {h, a, l, l, o, \0}; char c arr[0]; // 访问…

CentOS怎么关闭自动锁屏?

禁止自动锁屏 有时候几分钟不用Centos,系统就自动锁屏了,这是一种安全措施,防止别人趁你不在时使用你的系统。但对于大部分人而言,这是没有必要的,尤其是Centos虚拟机,里面没啥重要的东西,每次…

光伏发电管理软件:光伏企业的核心驱动力

光伏产业面对日益增长的装机容量、复杂多变的运维需求以及激烈的市场竞争,光伏企业如何高效管理、优化运营、提升效益,成为了行业关注的焦点。在此背景下,鹧鸪云光伏发电管理软件应运而生,并逐渐成为光伏企业的核心驱动力。 一、提…

Transformer合集

资料 位置编码:https://zhuanlan.zhihu.com/p/454482273 自注意力:https://zhuanlan.zhihu.com/p/455399791 LN:https://zhuanlan.zhihu.com/p/456863215 ResNet:https://zhuanlan.zhihu.com/p/459065530 Subword Tokenizati…

效率翻倍的秘密:探索AI工具的新世界

大家好,我是你们的效率小助手米兔!你是否曾在加班熬夜中挣扎,对着电脑屏幕发呆,感觉工作效率低到怀疑人生?别急,今天我要给你们安利几款超给力的AI工具,让你的工作变得轻松又愉快! …

c++笔记4

目录 深度优先搜索DFS DFS的复杂度 DFS与递归 递归与暴力枚举 递归树 DFS与栈 DFS的搜索剪枝 搜索剪枝与优化 可行性剪枝 最优化剪枝 减少等效的分支 优化搜索顺序 搜索的记忆化 搜索的复杂度 大多时候,搜索的复杂度都是指数级的。各种剪枝方案&#…

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析

2024世界技能大赛某省选拔赛“网络安全项目”B模块--操作系统取证解析 任务一、操作系统取证解析:总结:任务一、操作系统取证解析: A 集团某电脑系统被恶意份子攻击并控制,怀疑其执行了破坏操作,窃取了集团内部的敏感信息,现请分析 A 集团提供的系统镜像和内存镜像,找到…

WIX Toolset 3.11 对本地化的支持方案

1.准备主题文件和本地化文件 WIX Toolset种主题文件为xml文件,负责配置控件的布局, 本地化文件为wxl文件,负责配置待加载的字符串,主题文件根据ID加载需要显示的文字内容。考虑到英文和中文字符长度大小不一,所以这里…

与Bug较量:Codigger之软件项目体检Software Project HealthCheck来帮忙

在软件工程师的世界里,与 Java 小程序中的 Bug 作战是一场永不停歇的战役。每一个隐藏在代码深处的 Bug 都像是一个狡猾的敌人,时刻准备着给我们的项目带来麻烦。 最近,我就陷入了这样一场与 Java 小程序 Bug 的激烈较量中。这个小程序原本应…

【充电模块】

目录 一、实物图 二、原理图 引脚定义 模块特性 原理 三 、简介 四、注意事项 源文件下载 可访问底部联系方式也可前往电子校园网官网搜索关键词 关键词: 充电模块 一、实物图 二、原理图 引脚定…

springboot校园论坛网站-计算机毕业设计源码11401

摘 要 基于Java语言和Springboot框架的校园论坛网站设计与实现,为校园内的师生提供了丰富的功能和便捷的服务。本论文旨在详细介绍该网站的设计思路、功能特点以及技术实现。 论文介绍了网站的注册与登录功能,用户可以通过提供必要信息注册账号&#xf…

代码随想录算法训练营day6 | 242.有效的字母异位词、349. 两个数组的交集、202. 快乐数、1.两数之和

文章目录 哈希表键值 哈希函数哈希冲突拉链法线性探测法 常见的三种哈希结构集合映射C实现std::unordered_setstd::map 小结242.有效的字母异位词思路复习 349. 两个数组的交集使用数组实现哈希表的情况思路使用set实现哈希表的情况 202. 快乐数思路 1.两数之和思路 总结 今天是…

yolov8训练自己的实例分割数据集

参考: 1、官方教程:https://docs.ultralytics.com/zh/tasks/segment/ 2、YOLOv8制作自己的实例分割数据集保姆级教程(包含json转txt) 下载最新yolov8代码 git clone https://github.com/ultralytics/ultralytics.git一、制作自…

【日常记录】【JS】对一个数组,按照某个字段的值,进行分组

文章目录 1. 前言2. lodash 的分组3. Object.groupBy()参考链接 1. 前言 在开发中,经常会遇到一组数据,要按照某个字段进行分组,这个时候会有很多种方法,可以使用 forEach、reduce、等其他方法 reduce 方法 function groupBy(arr…

亚马逊云科技 re:Inforce 2024中国站大会

亚马逊云科技 re:Inforce 2024中国站大会 - 生成式AI时代的全面安全,将于7月25日本周四在北京富力万丽酒店揭幕