单链表(java实现)

2023-05-16

1.1 链表(Linked List)介绍

链表是有序的列表,但是它在内存中是存储如下
在这里插入图片描述

  1. 链表是以节点的方式来存储,是链式存储
  2. 每个节点包含 data 域, next 域:指向下一个节点.
  3. 如图:发现链表的各个节点不一定是连续存储.
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
     单链表(带头结点) 逻辑结构示意图如下
    在这里插入图片描述
    4.2 单链表的应用实例
    使用带 head 头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作,
    1) 第一种方法在添加英雄时,直接添加到链表的尾部 思路分析示意图:
    在这里插入图片描述
//定义SingLeLinkedList 管理英雄类
class singleLinkedList {
	//先初始化一个头结点 头结点不动 不放具体的数据
	private HeroNode head = new HeroNode(0, "", "");
	
	/*
	 * 添加节点到单向链表中 
	 * 	思路(不考虑编号顺序时:) 
	 * 		1.找到当前链表的最后节点 
	 * 		2.将最后这个节点的next指向新的节点
	 */
	public void add(HeroNode hero) {
		//因为head不能动 所以创建一个临时变量 辅助遍历
		HeroNode temp = head;
		while(true) {
			if(temp.nextHeroNode == null) {
				break;
			}
			temp = temp.nextHeroNode;
		}
		//当while循环退出时 就找到最后一个节点
		//将这个节点的next域指向新的节点
		temp.nextHeroNode=hero;
	}


	//显示节点
	public void list() {
		//判断链表是否为空
		if(head.nextHeroNode==null) {
			System.out.println("链表为空");
			return;
		}
		
		HeroNode temp = head.nextHeroNode;
		while(true) {
			if(temp==null) {
				break;
			}
			System.out.println(temp);
			temp = temp.nextHeroNode;
		}
	}
}

//定义HeroNode,每个HeroNode对象都是一个节点
class HeroNode{
	public int no;
	public String name;
	public String nickName;//绰号
	public HeroNode nextHeroNode;//指向下一个节点
	public HeroNode(int no, String name, String nickName) {
		super();
		this.no = no;
		this.name = name;
		this.nickName = nickName;
	}
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickName=" + nickName + "]";
	}
}

  1. 第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示) 思路的分析示意图:
    在这里插入图片描述
public void addByOrder(HeroNode heroNode) {
		HeroNode temp = head;
		boolean flag = false;//flag标志添加的编号是否存在 默认为false
		while(true) {
			if(temp.nextHeroNode == null) {//说明temp已经在链表的最后
				break;
			}
			if(temp.nextHeroNode.no > heroNode.no) {
				break;//位置找到就在temp后面插入
			}else if(temp.nextHeroNode.no == heroNode.no) {
				flag = true;//说明编号存在
				break;
			}
			temp = temp.nextHeroNode; 
		}
		
		if(flag) {
			System.out.printf("%d编号已经存在,不能添加了\n",heroNode.no);
		}else {
			heroNode.nextHeroNode = temp.nextHeroNode;
			temp.nextHeroNode = heroNode;
		}		
	}
  1. 修改节点功能
		(1) 先找到该节点,通过遍历,
		(2) temp.name = newHeroNode.name ;
			temp.nickname= newHeroNode.nickname 

	//更新
	//按编号查找 且编号不能更新
	public void update(HeroNode newHeroNode) {
		
		if(head.nextHeroNode==null) {
			System.out.println("链表为空~");
			return;
		}
		boolean flag = false;
		HeroNode temp = head.nextHeroNode;
		while(true) {
			if(temp == null) {
				break;//已经遍历完链表
			}
			if(temp.no == newHeroNode.no) {
				flag = true;
				break;
			}
			temp = temp.nextHeroNode;
		}
		
		if(flag) {
			temp.name = newHeroNode.name;
			temp.nickName = newHeroNode.nickName;
		}else {
			System.out.printf("编号为%d的这个节点不存在\n",newHeroNode.no);
		}
	}
	
  1. 删除节点 思路分析的示意图:
    在这里插入图片描述
//按编号删除
	public void delete(int no) {
		boolean flag = false;//是否找到
		HeroNode temp = head;

		while(true) {
			if(temp.nextHeroNode==null) {
				break;//遍历完整个链表了
			}
			if(temp.nextHeroNode.no == no) {
				flag = true;
				break;
			}
			temp = temp.nextHeroNode;
		}
		
		if(flag) {
			temp.nextHeroNode = temp.nextHeroNode.nextHeroNode;
		}else {
			System.out.printf("编号为%d的节点不存在\n",no);
		}
	}
	

测试代码

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 sL = new singleLinkedList();
		/*
		 * 按顺序添加
		 * sL.add(heroNode1); 
		 * sL.add(heroNode2); 
		 * sL.add(heroNode3);
		 *  sL.add(heroNode4);
		 */
		
		//不按顺序添加 但会按no排序
		sL.addByOrder(heroNode1);
		sL.addByOrder(heroNode3);
		sL.addByOrder(heroNode4);
		sL.addByOrder(heroNode2);
		sL.addByOrder(heroNode4);
		sL.list();
		System.out.println("+++++++++++");
		HeroNode heroNode = new HeroNode(4, "mary", "黑莓"); 
		HeroNode heroNode5 = new HeroNode(5, "mary", "黑莓"); 
		sL.update(heroNode);
		sL.update(heroNode5);
		sL.list();
		System.out.println("=================");
		sL.delete(1);
		sL.delete(2);
		sL.delete(3);
		sL.delete(4);
		sL.list();
		
	}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表(java实现) 的相关文章

  • Ubuntu使用管理员(root)身份登录系统

    Ubuntu使用管理员 xff08 root xff09 身份登录系统 一 Ubuntu安装好后 xff0c Ubuntu系统默认root用户是不能登录的 xff0c 密码也是空的 如果想要使用root用户登录 xff0c 必须先为root
  • Android使用代码进行界面布局和改变图标、标题、名称、主界面

    一 代码进行界面布局 lt xml version 61 34 1 0 34 encoding 61 34 utf 8 34 gt 二 Android Studio改变图标 标题 名称 主界面 注意 xff1a 64 表示是在哪个目录或者是
  • Linux(Ubuntu)系统如何安装Python

    Linux 系统是为编程而生的 xff0c 因此绝大多数的 Linux 发行版 xff08 Ubuntu CentOS 等 xff09 都默认自带了 Python 有的 Linux 发行版甚至还会自带两个版本的 Python xff0c 例
  • 如何用python实现多线程爬虫

    当单线程python爬虫已经不能满足企业需求时 xff0c 很多程序员会进行改代码或者增加服务器数量 xff0c 这样虽说也能达到效果 xff0c 但是对于人力物力也是一笔不小的消耗 如果是技术牛点的 xff0c 正常都会自己重新改写多线程
  • ## Hive分析疫情数据

    拿到的数据部分如下 xff1a 4月27日 黑龙江 境外输入 不详 0 45 0 黑龙江卫健委 https m thepaper cn newsDetail forward 7160075 4月27日 内蒙古 境外输入 不详 0 8 0 央
  • python --根据windows窗口名称、进程pid打开窗口(pygetwindow详解)

    pygetwindow详解 简介 pygetwindow是一个Python库 xff0c 用于获取 操作和管理当前打开的窗口 它提供了一些常用的窗口操作方法 xff0c 包括获取窗口句柄 xff0c 获取窗口位置和大小 xff0c 移动和调
  • Redhat Linux advance Server V2.1无法进入桌面(转)

    Redhat Linux advance Server V2 xff11 无法进入桌面 转 64 more 64 在本地调试安装了个Redhat Linux advance Server V2 1 xff0c 一共有5张光盘 xff0c 我
  • Mac上类似于xshell的远程工具:finalshell 和 royal tsx

    FinalShell 国产 国产 国产 自己研发的 是一体化的的服务器 网络管理软件 不仅是ssh客户端 还是功能强大的开发 运维工具 充分满足开发 运维需求 特色功能 免费海外服务器远程桌面加速 ssh加速 本地化命令输入框 支持自动补全
  • css查找元素注意事项

    一 CSS ID 选择器查找元素 1 注意 xff1a 如果元素的ID不唯一 xff0c 或者是动态的 或者name以及linktext属性值也不唯一 我们就需要考虑用Xpath来查找元素了 xff0c 然后再对元素执行操作 不管用什么方式
  • OS2.3.7:多生产者,多消费者问题

    文章目录 0 问题描述1 问题分析2 实现3 总结 0 问题描述 桌子上有一只盘子 xff0c 每次只能向其中放入一个水果 爸爸专向盘子中放苹果 xff0c 妈妈专向盘子中放橘子 xff0c 儿子专等着吃盘子中的橘子 xff0c 女儿专等着
  • java 方法名类名命名规范

    一 命名规范 1 项目名全部小写 2 包名全部小写 3 类名首字母大写 xff0c 如果类名由多个单词组成 xff0c 每个单词的首字母都要大写 大驼峰 xff0c 如 xff1a public class MyFirstClass 4 变
  • Qt arm环境安装

    一 相关工作准备 Qt opensource 和 Qt everywhere 下载 链接 版本为5 9 8 arm linux gcc下载 链接 版本为4 8 3 tslib 下载 链接 版本为1 21 ps 可以不安装Qt opensou
  • STM32驱动ST7789V2 tft屏幕

    一 简介 本次教程使用的是1 54寸240 240像素的tft屏幕 xff0c 其接口协议为SPI协议 在使用的过程中仅需要四根数据即可驱动点亮屏幕 然后硬件使用的是STM32F103C8T6核心板 xff0c 用的是SPI2 一般购买屏幕
  • linux设置复杂度策略、登录超时处理功能

    1 在字符终端下 xff0c 实现某一用户连续错误登陆N次后 xff0c 就锁定该用户X分钟 pam tally2 执行 vi etc pam d login 在 PAM 1 0 下新起一行 xff0c 加入 auth required p
  • 飞控陀螺仪,磁力计,加速计,四元数姿态结算

    MPU6050主要包含陀螺仪和加速度计 陀螺仪主要测量角速度 xff0c 即可以测出某一时间段物体转过的角度 加速度计测量的是物体的加速度 xff0c 重力加速度即物体受重力作用的情况下具有的加速度 xff0c 物体静止时 xff0c 加速
  • 智慧物业管理系统(Springboot)

    开发工具 xff1a IDEA xff0c jdk1 8 数据库 xff1a mysql5 7 前台框架 xff1a layui 后端技术 xff1a springboot 项目描述 xff1a 1 前台住户登录 2 智慧物业管理后台 2
  • 北京大学2020公开课 AVL-Python实现代码

    class TreeNode def init self key val left 61 None right 61 None parent 61 None self key 61 key self payload 61 val self
  • Docker-2020详细教程<配合千锋Java学习营>

    Docker 2020详细教程 lt 配合千锋Java学习营 gt 2020 Docker最新超详细版教程通俗易懂 一 Docker介绍 1 下载Dcoker依的赖环境 想安装Docker xff0c 需要先将依赖的环境全部下载下来 xff
  • 使用阿里云部署Flask网页

    使用阿里云部署Flask网页 前端网页部署 阿里云apache CentOS 配置好Apache后 xff0c 将一整个html css js文件全部copy进 var www html目录下 之后就可以通过访问IP地址访问到你的index
  • MapReduce的个人理解

    MapReduce的个人理解 文章目录 MapReduce模型简介Map和Reduce函数这里给出一个简单实例 MapReduce的工作流程工作流程概述MapReduce的各个执行阶段 Shuffle过程详解Shuffle过程简介Map端的

随机推荐

  • Hadoop配置

    Hadoop配置 文章目录 Linux shell配置环境变量使环境变量生效Hadoop 集群安装配置到两台阿里云linux主机上Hadoop集群模式安装实验环境实验内容1 安装jdk2 下面来修改环境变量3 安装hadoop4 下面来修改
  • HDFS 的使用和管理

    HDFS 的使用和管理 文章目录 HDFS 的使用和管理实验环境实验内容实验步骤1 启动hadoop的hdfs相关进程2 用jps查看HDFS是否启动3 验证HDFS运行状态4 ls 命令5 put 命令6 moveFromLocal 命令
  • HDFS API操作

    HDFS API操作 实验环境 Linux Ubuntu 16 04 前提条件 xff1a 1 xff09 Java 运行环境部署完成 2 xff09 Hadoop 的单点部署完成 上述前提条件 xff0c 我们已经为你准备就绪了 实验内容
  • HBase的安装部署和使用

    HBase的安装部署和使用 文章目录 HBase的安装部署和使用实验环境实验内容实验步骤1 点击 34 命令行终端 34 xff0c 打开新的命令行窗口2 解压安装包3 更改文件夹名和所属用户4 设置HBASE HOME环境变量5 修改hb
  • 熟悉常用的HBase操作

    熟悉常用的HBase操作 文章目录 实验环境实验内容1 编程实现以下指定功能 xff0c 并用Hadoop提供的HBase Shell命令完成相同的任务 xff08 1 xff09 列出HBase所有的表的相关信息 xff0c 如表名 创建
  • Hive的安装部署和管理

    Hive的安装部署和管理 文章目录 实验环境实验内容实验步骤1 点击 34 命令行终端 34 xff0c 打开新窗口2 解压安装包3 更改文件夹名和所属用户4 设置HIVE HOME环境变量5 导入MySql jdbc jar包到hive
  • Hive数仓:使用桶表

    Hive数仓 xff1a 使用桶表 文章目录 Hive数仓 xff1a 使用桶表实验环境实验步骤1 点击 34 命令行终端 34 xff0c 打开新窗口2 启动MySQL3 指定元数据数据库类型并初始化Schema4 启动Hadoop5 启
  • python 获取当前文件路径

    一 Python 获取当前文件路径方法 sys path 0 获取文件当前工作目录路径 绝对路径 sys argv 0 获得模块所在的路径 由系统决定是否是全名 若显示调用python指令 xff0c 如python demo py xff
  • PySpark中的RDD基本操作

    PySpark中的RDD基本操作 课程性质 xff1a PySpark数据处理 文章目录 1 实验目标2 本次实验主要使用的 P y t h
  • PySpark中的RDD创建

    PySpark中的RDD创建 课程性质 xff1a PySpark数据处理 文章目录 1 实验目标2 本次实验主要使用的 P y t h
  • el-table-column的formatter的使用

    当后端返回来的数据格式需要再去处理 xff1b 可以使用formatter属性 lt el table column label 61 34 性别 34 align 61 34 center 34 formatter 61 34 genda
  • 提示“无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系“的解决方案

    使用sudo apt get install lt packgename gt 时出现提示无法修正错误 xff0c 因为您要求某些软件包保持现状 xff0c 就是它们破坏了软件包间的依赖关系 可以换个命令 sudo aptitude ins
  • aosp下载、编译、刷机和单编framework(android 12)

    我的设备 xff1a 咸鱼上买的pixel 3a 一 aosp下载 1 安装repo mkdir bin PATH 61 bin PATH curl sSL 39 https gerrit googlesource proxy ustclu
  • LAMP架构之mysql的安装部署

    mysql的安装部署 一 mysql编译安装1 编译过程 二 LAMP架构的部署 一 mysql编译安装 官网地址如下 xff0c 进入选择版本 xff1a https downloads mysql com archives commun
  • hexo博客绑定自己的域名

    hexo博客绑定自己的域名 学习网址1 学习网址2 学习网址3 一 购买域名 登录阿里云账号 控制台 搜索框输入域名 域名注册 输入需要注册的域名 xff08 查看是否被占用 xff09 加入购物车 xff08 显示不能备案的不可买 xff
  • SimpleDateFormat类 格式化日期

    功能 xff1a 格式化和解析日期 将Date类型的日期格式化成我们需要的日期类型一般是 字符串类型将字符串类的日期再转回来 用到两个方法 format Date date xff1a 将date型转换成特定格式的字符串 parse Str
  • 队列(Java实现)

    1 1应用场景 银行排队 xff1a 1 2基本介绍 特点 队列是一个有序列表 xff0c 可以用数组或是链表来实现 遵循先入先出的原则 即 xff1a 先存入队列的数据 xff0c 要先取出 后存入的要后取出 示意图 解释 MaxSize
  • IO字节流读取文本中文乱码

    1 1问题说明 我们都知道字符流适用于读取文本 xff0c 而字节流能读取文本 照片 视频等 xff0c 但是用字节流读取文本到我们程序的控制台中会出现中文乱码的情况 xff0c 如下图 我的文本中的数据是 生活很简单 xff0c 过了今天
  • glibc所安装的工具程序

    catchsegv 当程序发生segmentation fault的时候 用来建立一个 堆栈跟踪 gencat 建立消息列表 getconf 针对文件系统的指定变量显示其系统设置值 getent 从 系统管理数据库获取一个条目 glibcb
  • 单链表(java实现)

    1 1 链表 Linked List 介绍 链表是有序的列表 xff0c 但是它在内存中是存储如下 链表是以节点的方式来存储 是链式存储每个节点包含 data 域 xff0c next 域 xff1a 指向下一个节点 如图 xff1a 发现