数据结构4-单链表的删除修改和查找

2023-10-27

1.单链表按照顺序插入节点

package com.yin.m3LinkedList;

public class SingleLinkedListDemo {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试
		//创建节点
		HeroNode hero1=new HeroNode(1,"1白敬亭","1小白");
		HeroNode hero2=new HeroNode(2,"2杨洋","2小羊");
		HeroNode hero3=new HeroNode(3,"3刘昊然","3然然");
		HeroNode hero4=new HeroNode(4,"4刘瑞琳","4小刘");
		//创建链表
		SingleLinkedList singleLinkedList=new SingleLinkedList();
		//加入   
//		singleLinkedList.add(hero1);
//		singleLinkedList.add(hero2);
//		singleLinkedList.add(hero3);
//		singleLinkedList.add(hero4);
		
		//加入,按照编号顺序
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero3);
		singleLinkedList.addByOrder(hero2);
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero4);
		//显示
		singleLinkedList.list();
	}
}

//定义一个SingleLinkedList管理
class SingleLinkedList{
	//初始化头节点
	private HeroNode head = new HeroNode(0,"","");
	
	//添加节点到单项列表
	public void add(HeroNode heroNode) {
		//1.找到链表最后节点
		HeroNode temp=head;
		while(true) {
			//找到链表的最后
			if(temp.next==null) {
				break;
			}
			temp=temp.next;
		}//退出循环时,temp指向链表最后
		temp.next=heroNode;
	}
	
	//第二种方式添加英雄时,根据排名将英雄插入到指定位置
	public void addByOrder(HeroNode heroNode) {
		//因为头节点不能动,利用辅助节点
		HeroNode temp=head;
		boolean flag=false;//添加的编号是否存在,默认不存在
		while(true) {
			if(temp.next==null) {//说明temp已经在链表的最后
				break;
			}
			if(temp.next.no>heroNode.no) {//在temp后面
				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 {
			//插入到链表中
			heroNode.next=temp.next;
			temp.next=heroNode;
		}
	}
		
	//显示链表
	public void list() {
		//判断链表是否为空
		if(head.next==null) {
			System.out.println("链表为空");
			return;
		}
		//因为头节点不能动,需要辅助变量temp遍历
		HeroNode temp=head.next;
		while(true) {
			//找到链表的最后
			if(temp==null) {
				break;
			}
			//输出节点信息
			System.out.println(temp);
			//temp要后移
			temp=temp.next;
		}//退出循环时,temp指向链表最后
	}
}

//定义一个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方法  alt+shift+s
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" +"]";
	}
}

2.单链表结点的修改

package com.yin.m3LinkedList;

public class SingleLinkedListDemo {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//测试
		//创建节点
		HeroNode hero1=new HeroNode(1,"1白敬亭","1小白");
		HeroNode hero2=new HeroNode(2,"2杨洋","2小羊");
		HeroNode hero3=new HeroNode(3,"3刘昊然","3然然");
		HeroNode hero4=new HeroNode(4,"4刘瑞琳","4小刘");
		//创建链表
		SingleLinkedList singleLinkedList=new SingleLinkedList();
		//加入   
//		singleLinkedList.add(hero1);
//		singleLinkedList.add(hero2);
//		singleLinkedList.add(hero3);
//		singleLinkedList.add(hero4);
		
		//加入,按照编号顺序
		singleLinkedList.addByOrder(hero4);
		singleLinkedList.addByOrder(hero3);
		singleLinkedList.addByOrder(hero2);
		singleLinkedList.addByOrder(hero1);
		singleLinkedList.addByOrder(hero4);
		
		//修改前显示
		System.out.println("修改前的链表情况:");
		singleLinkedList.list();
		
		//测试修改节点代码
		HeroNode newHeroNode=new HeroNode(2,"2更改后的杨洋","2黑风夕");
		singleLinkedList.update(newHeroNode);
		
		
		//显示
		System.out.println("修改后的链表情况:");
		singleLinkedList.list();

	}

}


//定义一个SingleLinkedList管理
class SingleLinkedList{
	//初始化头节点
	private HeroNode head = new HeroNode(0,"","");
	
	//添加节点到单项列表
	public void add(HeroNode heroNode) {
		//1.找到链表最后节点
		HeroNode temp=head;
		while(true) {
			//找到链表的最后
			if(temp.next==null) {
				break;
			}
			temp=temp.next;
		}//退出循环时,temp指向链表最后
		temp.next=heroNode;
	}
	
	//第二种方式添加英雄时,根据排名将英雄插入到指定位置
	public void addByOrder(HeroNode heroNode) {
		//因为头节点不能动,利用辅助节点
		HeroNode temp=head;
		boolean flag=false;//添加的编号是否存在,默认不存在
		while(true) {
			if(temp.next==null) {//说明temp已经在链表的最后
				break;
			}
			if(temp.next.no>heroNode.no) {//在temp后面
				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 {
			//插入到链表中
			heroNode.next=temp.next;
			temp.next=heroNode;
		}
	}
	
	//修改节点的信息,根据编号修改,编号no不能改
	public void update(HeroNode newHeroNode) {
		//判断是否为空
		if(head.next==null) {
			System.out.println("链表为空~");
			return;
		}
		//找到需要的节点,根据no编号
		//定义一个辅助变量
		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);
		}
	}
	
	//显示链表
	public void list() {
		//判断链表是否为空
		if(head.next==null) {
			System.out.println("链表为空");
			return;
		}
		//因为头节点不能动,需要辅助变量temp遍历
		HeroNode temp=head.next;
		while(true) {
			//找到链表的最后
			if(temp==null) {
				break;
			}
			//输出节点信息
			System.out.println(temp);
			//temp要后移
			temp=temp.next;
		}//退出循环时,temp指向链表最后
	}
}



//定义一个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方法  alt+shift+s
	@Override
	public String toString() {
		return "HeroNode [no=" + no + ", name=" + name + ", nickname=" +nickname+"]";
	}
	
	//
	
}

3.单链表结点的删除

注意要用temp找到待删除结点的前一个结点
让temp.next=temp.next.next*
被删除的节点不会有其他引用指向,会被垃圾回收机制回收。

//删除结点的代码
	//head节点不能动,引用temp辅助节点
	public void del(int no) {
		HeroNode temp=head;
		boolean flag=false;//表示是否找到待删除节点的前一个节点,默认是否
		while(true) {
			if(temp.next==null) {//已经遍历到链表最后
				break;
			}
			if(temp.next.no==no) {
				//找到了待删除节点的前一个节点temp
				flag=true;
				break;
			}
			temp=temp.next;//temp后移,遍历
		}
		//判断flag
		if(flag) {
			//可以删除
			temp.next=temp.next.next;
		}else {
			System.out.printf("要删除的%d节点不存在", no);
		}
	}
//删除前显示
		System.out.println("删除前的链表情况:");
		singleLinkedList.list();
				
		//测试删除节点代码
		singleLinkedList.del(2);
				
				
		//显示
		System.out.println("删除后的链表情况:");
		singleLinkedList.list();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构4-单链表的删除修改和查找 的相关文章

  • HCSC: Hierarchical Contrastive Selective Coding 解读

    HCSC Hierarchical Contrastive Selective Coding 在图像数据集中 往往存在分层级的语义结构 例如狗这一层级的图像中又可以划分为贵宾 金毛等细粒度的类别 例如这张图 展示了一个数据集中的多种语音层级
  • 在Android Studio中将Android工程变为Library使用

    有时候网上会有些工程格式不是我们想要的Library格式可以直接给AS使用 这时我们就需要将它移植到AS上并将其变为库 1 将ADT工程export成gradle可编译的工程 2 导入AS 保留src res manifest和gradle

随机推荐

  • 想成为月薪40K的测试工程师?你可能只是差在了这里....

    2022年的金三银四跳槽季来临 不知道各位有没有做好准备呢 最近跟朋友在一起聚会的时候 提了一个问题 说Java程序员要实现月薪40K 技术水平需要达到什么程度 首先 40K对应的层级分别是什么 40K的月薪在BAT等一线大厂实在太普遍了
  • Java虚拟机内存区域

    一 Java虚拟机内存区域 Java虚拟机所管理的内存将分为以下几个区域 1 程序计数器 线程私有 可以看作是当前线程所执行字节码的行号指示器 字节码解释器工作时就是改变这个计数器的值来选取下一条需要执行的指令 一些基础的功能 在一个确定的
  • controller(控制器)

    controller 控制器 1 什么是controller 1 在集群上管理和运行容器的对象 2 Pod和controller关系 1 Pod是通过Controller实现应用的运维 比如伸缩 滚动升级等 2 Pod和Controller
  • 运行Vue时出错 Error: @vitejs/plugin-vue requires vue (>=3.2.13)

    Error vitejs plugin vue requires vue gt 3 2 13 or vue compiler sfc to be present in the dependency tree 错误 vitejs plugin
  • 解决IE5、IE6、IE7与W3C标准的冲突(IE7.js IE8.js)

    如果分别用IE5 IE6 IE7浏览同一个网页 将可能出现不一样的效果 这是它们之间对CSS的解析选择器不一样或错误和个别bug所导致 为了解决这些错误和bug 我们不得不找到一个能平衡于它们之间的解决方法 如png透明问题在IE5 IE6
  • Java学习——“+”的连接及加和的简单说明

    Java中 的简单说明 在今天的学习中 学到了 在java语言中的作用有加和运算和做连接符 1 加和运算 上一次提到了Java中的基本数据类型 而 就可以计算出基本数据类型的加和 int a 12 int f 123 int c a f S
  • [C++ Template]深入模板--实例化

    目录 第10章 实例化 10 1 On Demand实例化 10 2 延迟实例化 10 3 C 的实例化模型 10 3 1 两阶段查找 10 3 2 POI 10 3 5 例子 10 5 显式实例化 第10章 实例化 模板实例化是一个过程
  • 本地储存(设置和获取信息)

  • 【Qt】win10下安装Qt5.12.12

    文章目录 前言 一 下载安装包 二 安装步骤 1 注册账户 2 安装过程 前言 最近由于课题的需要 下载Qt 特此记录安装过程 一 下载安装包 笔者使用的是清华的源 也可以去官网下载 清华源如下 https mirror tuna tsin
  • 【华为OD机试】计算最接近的数【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 给定一个数组X和正整数K 请找出使表达式 X i X i 1 X i K 1 结果最接近于数组中位数的下标 i 如果有多个 i 满足条件 请返回最大的 i 其中 数组
  • 图像掩膜的作用

    用选定的图像 图形或物体 对待处理的图像 全部或局部 进行遮挡 来控制图像处理的区域或处理过程 用于覆盖的特定图像或物体称为掩模或模板 光学图像处理中 掩模可以足胶片 滤光片等 数字图像处理中 掩模为二维矩阵数组 有时也用多值图像 数字图像
  • ROS机器人应用(4)—— 查看里程计、IMU 话题信息

    文章目录 1 查看ODOM IMU 话题信息 2 相关数据结构解释 1 查看ODOM IMU 话题信息 小车开机 连接WIFI 密码 dongguan SSH 远程登录 ssh wheeltec 192 168 0 100 密码 dongg
  • 关于知识图谱的应用方向

    如何利用大数据风控体系应对多渠道风险 1 合合信息失联客户管理知识图谱 部分借款人在借款成功后出现不还款现象并且 失联 使得催收人员因无法联系借款人本人 无从下手 借助知识图谱 挖掘出更多的与借款人有关系的新联系人 大大提高催收成功率 关联
  • guns+apiPost

    当通过guns接口生成器生成代码后 直接用已经生成的接口用于apiPost测试是不通过的 一种方式是处理这里的验证 另一种方式是为了便于接口测试 可以在shiroConfig设置该接口不验证 注意 不安全性也增加了 hashMap put
  • java判断文件类型

    页面代码
  • Python爬虫如何快速入门学习?

    Python爬虫是一种用于自动化网页数据抓取的技术 它能够帮助我们快速 高效地获取互联网上的数据 对于那些想要快速入门学习Python爬虫的人来说 可能会有一些困惑 如何才能快速掌握Python爬虫的基本原理和技巧 在本文中 我们将分享一些
  • Java线程同步-栅栏(CyclicBarrier)

    Java线程同步 栅栏 CyclicBarrier 栅栏是一种同步工具 用于等待一组线程达到某个共同点后再同时继续执行 它的内部维护一个计数器和一个屏障点 当线程到达屏障点时 会阻塞等待其他线程到达 每一个线程到达屏障点后 计算器就减1 当
  • 我在windows10下,使用msys64 mingw64终端

    系列文章目录 文章目录 系列文章目录 前言 一 MSYS2是什么 前言 msys2官网 MSYS2 Minimal SYStem 2 是一个MSYS的独立改写版本 主要用于 shell 命令行开发环境 同时它也是一个在Cygwin POSI
  • JavaDay06

    用户登录 提示用户输入用户名和密码 如果用户名和密码不是 admin 和 123 的话 就提示用户继续输入 最多输入五次 用户登录 提示用户输入用户名和密码 如果用户名和密码不是 admin 和 123 的话 就提示用户继续输入 最多输入五
  • 数据结构4-单链表的删除修改和查找

    1 单链表按照顺序插入节点 package com yin m3LinkedList public class SingleLinkedListDemo public static void main String args TODO Au