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

介绍

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

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

②每个节点包含 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://xiahunao.cn/news/3266206.html

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

相关文章

netty入门-6 Handler和Pipeline

前言 书上讲服务器客户端创建三个要点,线程模型(Group),IO模型(NioSocketChannel),处理逻辑。 这篇的Handler和Pipeline,就是我们IO操作的处理逻辑。 然后下篇说ByteBuf这个Netty自己实现的数据封装组件。 Handler和Pipeline 我…

GAT知识总结

《GRAPH ATTENTION NETWORKS》 解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题,GAT借鉴了Transformer的idea,引入masked self-attention机制, 在计算图中的每个节点的表示的时候,会根据邻居节点特征的不同来…

57 数据链路层

用于两个设备(同一种数据链路节点)之间传递 目录 对比理解“数据链路层” 和 “网络层”以太网 2.1 认识以太网 2.2 以太网帧格式MAC地址 3.1 认识MAC地址 3.2 对比理解MAC地址和IP地址局域网通信MTU 5.1 认识MTU 5.2 MTU对ip协议的影响 5.3 MTU对UDP的…

javafx的ListView代入项目的使用

目录 1. 创建一个可观察的列表,用于存储ListView中的数据,这里的User是包装了用户的相关信息。 2.通过本人id获取friendid,及好友的id,然后用集合接送,更方便直观一点。 3.用for遍历集合,逐个添加。 4.渲染器&…

非凸T0算法,如何获取超额收益?

什么是非凸 T0 算法? 非凸 T0 算法基于投资者持有的股票持仓,利用机器学习等技术,短周期预测,全自动操作,抓取行情波动价差,增厚产品收益。通过开仓金额限制、持仓时长控制等,把控盈亏风险&…

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…

基于Python的二手房价格分析与多种机器学习房价预测

需要本项目的同学可以私信我,提供部署讲解服务和文档 近年来,中国各个城市的房价问题一直是人们所关心的焦点之一。随着新建房价的不断上涨,城市内建筑新房的用地也越来越少,加上对房屋刚性的需求,人民群众对二手房的…

rust 初探 -- use

rust 初探 – use Package, Crate, 定义 Module use 关键字 作用:将路径引入到作用域内,其依旧遵循私有性规则,也即只用 pub 的部分引入进来才能使用 use crate::front_of_house::hosting; // 绝对路径 // use front_of_house::hosting; …

爬取贴吧的标题和链接

免责声明 感谢您学习本爬虫学习Demo。在使用本Demo之前,请仔细阅读以下免责声明: 学习和研究目的:本爬虫Demo仅供学习和研究使用。用户不得将其用于任何商业用途或其他未经授权的行为。合法性:用户在使用本Demo时,应确…

个性化音频生成GPT-SoVits部署使用和API调用

一、训练自己的音色模型步骤 1、准备好要训练的数据,放在Data文件夹中,按照文件模板中的结构进行存放数据 2、双击打开go-webui.bat文件,等待页面跳转 3、页面打开后,开始训练自己的模型 (1)、人声伴奏分…

关于sqlite数据库转化mysql数据

使用工具 下图所使用的为navivat premium 16数据库管理工具。 如下图所示为sqlite数据库db数据 下图为所设计的sqlite数据表格字段属性 首先导出sql语句 打开工具栏中的数据传输功能。 如上图所示,选择目标选为文件,并且将默认勾选的与源服务器相同…

oracle读写时相关字符集详解

服务器端操作系统(Oracle linux)字符集 服务器端数据库字符集 客户端操作系统(Oracle linux)字符集 客户端工具sqlplus字符集 结论1:客户端工具sqlplus的会话,使用的字符集,是数据库字符集。…

Android 15 适配整理——实践版

背景 谷歌发布Android 15后,国内的手机厂商迅速行动,开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告,督促APP开发者在2024年8月31日前完成适配工作,否则将面临搜索标签提示、应用降级、分机型…

zookeeper开启SASL权限认证

目录 一、SASL介绍 二、使用 SASL 进行身份验证 2.1 服务器到服务器的身份验证 2.2 客户端到服务器身份验证 三、验证功能 一、SASL介绍 默认情况下,ZooKeeper 不使用任何形式的身份验证并允许匿名连接。但是,它支持 Java 身份验证与授权服务(JAAS)…

学习日记:数据类型2

目录 1.转义字符 2.隐式类型转换 2.1 强制类型转换 2.2 不同类型间赋值 3.运算符 表达式 3.1 算术运算符 3.2 算术运算优先级 3.3 赋值运算 3.3.1 不同类型间混合赋值 3.4 逗号运算 4.生成随机数 5. 每日一练 1.转义字符 \n 表示换行 \t …

3.2、数据结构-数组、矩阵和广义表

数组结构 数组是定长线性表在维度上的扩展,即线性表中的元素又是一个线性表。N维数组是一种“同构”的数据结构,其每个数据元素类型相同、结构一致。 一个m行n列的数组表示如下: 其可以表示为行向量形式(一行一行的数据)或者列向量形式(一…

【Python第三方库】PyQt5安装与应用

文章目录 引言安装PYQT5基于Pyqt5的简单桌面应用常用的方法与属性QtDesigner工具使用与集成窗口类型QWidget和QMainWindow区别 UI文件加载方式直接加载UI文件的方式显示窗口转化py文件进行显示窗口 PyQt5中常用的操作信号与槽的设置绑定页面跳转 引言 PyQt5是一个流行的Python…

自动化测试--WebDriver API

1. 元素定位方法 通过 ID 定位:如果元素具有唯一的 ID 属性,可以使用 findElement(By.id("elementId")) 方法来定位元素。通过 Name 定位:使用 findElement(By.name("elementName")) 来查找具有指定名称的元素。通过 Cl…

哈默纳科HarmonicDrive谐波减速机的使用寿命计算

在机械传动系统中,减速机的应用无处不在,而HarmonicDrive哈默纳科谐波减速机以其独特的优势,如轻量、小型、传动效率高、减速范围广、精度高等特点,成为了众多领域的选择。然而,任何机械设备都有其使用寿命&#xff0c…

通信原理-思科实验三:无线局域网实验

实验三 无线局域网实验 一:无线局域网基础服务集 实验步骤: 进入物理工作区,导航选择 城市家园; 选择设备 AP0,并分别选择Laptop0、Laptop1放在APO范围外区域 修改笔记本的网卡,从以太网卡切换到无线网卡WPC300N 切…