004--认识单链表

news/2024/4/23 15:17:10/文章来源:https://blog.csdn.net/m0_56116754/article/details/129209360

一、链表介绍

  1. 链表是有序的列表:
  • 链表是以节点的方式来存储,是链式存储
  • 每个节点包含data域:存放数据 ,next域:指向下一个节点; Head节点:data域不存放具体的数据,作用就是表示单链表表头,next域指向下一个节点;如果next域为空null,则结束
  • 发现链表的各个节点不一定是连续存放的;通过next域来确定下一个节点
  • 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。

二、单链表创建和遍历

  1. 添加(创建):
  • 先创建一个head头节点,作用就是表示单链表的头
  • 后面我们每添加一个节点,就直接加入到链表的最后
  • 遍历:通过一个辅助变量,帮助遍历整个链表
  1. 代码实现
  • 第一种:不考虑编号顺序,直接把添加的放在最后一个元素、
package com.xqh.linklist;public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试,先创建节点HeroNode hero1 = new HeroNode(1,"宋江","及时雨");HeroNode hero2 = new HeroNode(2,"吴用","智多星");HeroNode hero3 = new HeroNode(3,"卢俊义","玉麒麟");HeroNode hero4 = new HeroNode(4,"杨志","青面虎");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();singleLinkedList.add(hero1);singleLinkedList.add(hero2);singleLinkedList.add(hero3);singleLinkedList.add(hero4);singleLinkedList.list();}}//定义SingleLinkedList  管理我们的英雄
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 = temp.next;}//当退出while循环时,temp就指向了链表的最后//将最后这个节点的next指向新的节点temp.next = heroNode;}//显示链表【遍历】public void list() {//判断链表是否为空if(head.next == null) {System.out.println("链表为空");return;}//因为头节点,不能动,因此我们需要一个辅助变量来遍历HeroNode temp = head.next;while(true) {//判断是否到链表最后if(temp==null) {break;}//输出节点的信息System.out.println(temp);//将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 +"]";}}
  • 第二种方式:在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)

思路:

首先找到新添加的节点的位置,是通过辅助变量

使 新的节点.next = temp.next

将temp.next = 新的节点

package com.xqh.linklist;public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试,先创建节点HeroNode hero1 = new HeroNode(1,"宋江","及时雨");HeroNode hero2 = new HeroNode(2,"吴用","智多星");HeroNode hero3 = new HeroNode(3,"卢俊义","玉麒麟");HeroNode hero4 = new HeroNode(4,"杨志","青面虎");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();//第一种添加
//		singleLinkedList.add(hero1);
//		singleLinkedList.add(hero2);
//		singleLinkedList.add(hero3);
//		singleLinkedList.add(hero4);//第二种添加singleLinkedList.addByOrder(hero1);singleLinkedList.addByOrder(hero4);singleLinkedList.addByOrder(hero3);singleLinkedList.addByOrder(hero2);singleLinkedList.list();}}//定义SingleLinkedList  管理我们的英雄
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 = temp.next;}//当退出while循环时,temp就指向了链表的最后//将最后这个节点的next指向新的节点temp.next = heroNode;}//第二种添加方式,在添加英雄时,根据排名将英雄插入到指定位置//(如果有这个排名,则添加失败,并给出提示)public void addByOrder(HeroNode heroNode) {//首先头节点不能动,需要通过一个辅助指针来帮助找到添加的位置,因为单链表//因为单链表,因此我们找的temp是位于添加位置的前一个节点,temp从head开始遍历,直到temp.next.no>hero.no//说明,此时hero就应该插在temp和他的下一个之间HeroNode temp = head;boolean flag = false;  //标识添加的编号是否存在,默认为falsewhile(true) {if(temp.next == null) {//说明此时temp位于最末端,直接退出循环break;}else if(temp.next.no>heroNode.no) {//此时就是插入数据的位置在temp和temp.next之间,一大一小在中间插入break;}else if(temp.next.no == heroNode.no) {//说明编号已经存在flag = true;break;}temp = temp.next;  //如果temp.next.no小于heroNode.no,那么没找到插入位置,那么继续遍历temp}//判断flag的值if(flag) {//编号存在,不能添加System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入\n",heroNode.no);			}else {//插入到链表中heroNode.next = temp.next;temp.next = heroNode;}}//显示链表【遍历】public void list() {//判断链表是否为空if(head.next == null) {System.out.println("链表为空");return;}//因为头节点,不能动,因此我们需要一个辅助变量来遍历HeroNode temp = head.next;while(true) {//判断是否到链表最后if(temp==null) {break;}//输出节点的信息System.out.println(temp);//将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. 先遍历链表,找到符合修改节点的编号-----用flag来标识是否查找到符合节点的编号
  2. 如果没找到提示信息,如果找到,修改节点信息,使此时temp所指向的节点的name和nickname修改为修改节点的信息
//根据编号修改,定义一个辅助指针HeroNode temp = head.next;boolean flag = false;while(true) {if(temp==null) {break;//已经遍历结束}if(temp.no == newHeroNode.no) {//找到了修改的节点flag = true;break;}temp = temp.next;}if(flag) {temp.name=newHeroNode.name;temp.nickname=newHeroNode.nickname;}else {//没有找到这个节点System.out.printf("没有找到编号为%d的节点,不能修改 \n",newHeroNode.no);}}....//测试singleLinkedList.list();HeroNode newHeroNode = new HeroNode(2,"豹子头","林冲");singleLinkedList.update(newHeroNode);

四、单链表节点的删除

  1. 思路:
  • 我们先找到需要删除的这个节点的前一个节点temp
  • 使temp.next = temp.next.next
  • 被删除的节点,将不会有其他引用指向,会被垃圾回收机制回收
//删除节点public void delete(int no) {if(head.next==null) {System.out.println("链表为空,无法删除");return;}HeroNode temp = head;boolean flag = false;while(true) {if(temp.next==null) {break;}if(temp.next.no== no) {flag=true;break;}temp=temp.next;}if(flag) {temp.next=temp.next.next;}else {System.out.printf("你要删除的编号%d,没有找到\n",no);}}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

12.STM32系统定时器-SysTick

目录 1.系统定时器-SysTick 2.SysTick定时时间的计算 3.SysTick结构体 4.SysTick固件库函数 5.SysTick中断优先级 1.系统定时器-SysTick SysTick:24位系统定时器,只能递减,存在于内核嵌套在NVIC中。所有的Cortex-M中都有这个系统定时器。 重装载值…

interrupt多线程设计模式

1. 两阶段终止-interrupt Two Phase Termination 在一个线程T1中如何“优雅”终止线程T2?这里的【优雅】指的是给T2一个料理后事的机会。 错误思路 ● 使用线程对象的stop()方法停止线程(强制杀死) —— stop()方法…

会声会影2023电脑版下载及系统配置要求

平时大家可能会经常听到有人说会声会影,但是很多人都不知道这是什么软件。其实听它的名字就知道这是一款和声音、影像有关系的软件。下面,小编就来给大家具体介绍一下这款软件吧。 会声会影是一套操作简单的DV、HDV影片剪辑软件。会声会影不仅完全符合家…

农业科技发展所带来的好处:提高农作物产量,提高农民收入

农业科技发展所带来的好处::(1)育种技术:通过育种技术,科学家可以在农作物基因中挑选和改变一些特定的性状,例如增加产量、改善耐旱性和抗病性等等,从而提高农作物产量。&#xff08…

el-cascader 级联选择器懒加载的使用及回显 + 点击任意一级都能返回

需要实现的需求 数据渲染使用懒加载点击任意一级都可返回&#xff0c;不需要一直点到最后一级编辑或者查看功能&#xff0c;回显之前选择的数据 实例解析 dom 元素 <el-cascaderv-model"value":options"options":props"props":key"n…

Linux内核段页式内存管理技术

一、概述 1.虚拟地址空间 内存是通过指针寻址的&#xff0c;因而CPU的字长决定了CPU所能管理的地址空间的大小&#xff0c;该地址空间就被称为虚拟地址空间&#xff0c;因此32位CPU的虚拟地址空间大小为4G&#xff0c;这和实际的物理内存数量无关。 Linux内核将虚拟地址空间分…

五种IO模型以及select多路转接IO模型

目录 一、典型IO模型 1.1 阻塞IO 1.2 非阻塞IO 1.3 信号驱动I0 1.4 IO多路转接 1.5 异步IO 多路转接的作用和意义 二、多路转接IO模型&#xff08;select&#xff09; 2.1 接口 2.2 接口当中的事件集合&#xff1a; fd_set 2.2 select使用事件集合&#xff08;位图&am…

174万亿采购,奔向数字化

采购不单纯发生在外部&#xff0c;更发生在内部&#xff0c;只有两者同时进行&#xff0c;才能完成采购中心从成本到利润中心角色的转变。 作者|斗斗 编辑|皮爷 出品|产业家 数字化&#xff0c;让很多企业业务流程发生了质变。 《2022数字化采购发展报告》显示&#x…

破解票房之谜:为何高票房电影绕不过“猫眼们”?

如此火爆的春节档很多&#xff0c;如此毁誉参半的春节档鲜有。2023开年&#xff0c;集齐张艺谋、沈腾的《满江红》&#xff0c;以及有票房前作打底的《流浪地球2》接连两部春节档电影票房进入前十&#xff0c;为有些颓靡的中国电影市场注入了一针“强心剂”。与票房同样热闹起来…

无重叠区间-力扣435-java贪心策略

一、题目描述给定一个区间的集合 intervals &#xff0c;其中 intervals[i] [starti, endi] 。返回 需要移除区间的最小数量&#xff0c;使剩余区间互不重叠 。示例 1:输入: intervals [[1,2],[2,3],[3,4],[1,3]]输出: 1解释: 移除 [1,3] 后&#xff0c;剩下的区间没有重叠。…

【爬虫】2.2 BeautifulSoup 装载HTML文档

HTML文档结点的查找工具很多&#xff0c;其中 BeautifulSoup 是功能强大且十分流行的查找工具之一。1. BeautifulSoup 的安装安装&#xff1a;pip install bs4导包&#xff1a;from bs4 import BeautifulSoup2. BeautifulSoup 装载HTML文档如果 doc 是一个 HTML 文档&#xff0…

深度学习训练营之yolov5 官方代码调用以及-requirements.txt下载当中遇到的问题

深度学习训练营之yolov5 官方代码调用原文链接内容总结环境介绍前置工作简单介绍yolov5下载源码yolov5的下载遇到问题问题解析问题处理创建虚拟环境下载当中遇到的问题代码运行视频检测参考内容原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客…

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器

gazebo仿真环境中添加robotiq 2f 140的gripper_controller控制器 搭建环境&#xff1a; ubuntu: 20.04 ros: Nonetic sensor: robotiq_ft300 gripper: robotiq_2f_140_gripper UR: UR3 reasense&#xff1a; D435i 通过下面几篇博客配置好了ur3、力传感器、robotiq夹爪、rea…

18523-47-2,3-Azidopropionic Acid,叠氮基丙酸,可以与炔烃发生点击化学反应

【中文名称】3-叠氮基丙酸【英文名称】 3-Azidopropionic Acid&#xff0c;3-Azidopropionic COOH【结 构 式】【CAS】18523-47-2【分子式】C3H5N3O2【分子量】115.09【纯度标准】95%【包装规格】1g&#xff0c;5g&#xff0c;10g【是否接受定制】可进行定制&#xff0c;定制时…

java原理4:java的io网络模型

文章目录1&#xff1a;基础概念1&#xff1a;同步和异步2&#xff1a;阻塞和非阻塞2.1&#xff1a;阻塞IO2.2&#xff1a;非阻塞io2.3&#xff1a;io复用3&#xff1a;同步/异步和阻塞/非阻塞3.1&#xff1a;同步非阻塞NIO4: redis为什么速度快Java 网络IO模型简介1&#xff1a…

Tapdata 和 Databend 数仓数据同步实战

作者&#xff1a;韩山杰https://github.com/hantmacDatabend Cloud 研发工程师基础架构在云计算时代也发生着翻天地覆的变化&#xff0c;对于业务的支持变成了如何能利用好云资源实现降本增效&#xff0c;同时更好的支撑业务也成为新时代技术人员的挑战。 本篇文章通过&#xf…

删除MySQL表中的重复数据?

前言 一般我们将数据存储在MySQL数据库中&#xff0c;它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据&#xff0c;那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊&#xff0c;我还没有创建唯一索引捏&#xff0c;数据就重复了&…

jianzhiOffer第二版难重点记录

04. 二维数组中的查找https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 思路&#xff1a;可以每层用以恶搞二分查找&#xff0c;优化思路&#xff1a;从左下角出发直接用二分。 ​​​​​​07. 重建二叉树https://leetcode.cn/problems/zhong-jian-er-cha…

springboot+vue.js高校大学生选课成绩管理系统javaweb

本课题要求实现一套学生成绩管理系统&#xff0c;系统主要包括管理员&#xff0c;学生和教师三大模块 (a) 管理员&#xff1b;管理员进入系统主要功能包括首页&#xff0c;个人中心&#xff0c;教师管理&#xff0c;学生管理&#xff0c;公告信息管理&#xff0c;课程类型管理&…

Android自定义View实现横向的双水波纹进度条

效果图&#xff1a;网上垂直的水波纹进度条很多&#xff0c;但横向的很少&#xff0c;将垂直的水波纹改为水平的还遇到了些麻烦&#xff0c;现在完善后发布出来&#xff0c;希望遇到的人少躺点坑。思路分析整体效果可分为三个&#xff0c;绘制圆角背景和圆角矩形&#xff0c;绘…