数据结构(Java)——双向链表

java数据结构——双向链表详解 双向链表提供了向前遍历,也可以向后遍历整个链表,其中的问题关键就在每个链结点有两个指向其他链结点的引用。而不是一个,第一个像普通链表一样指向下一个链结点,第二个指向前一个链结点 ,如图:借用算计算法与结构书中的图片 双向链表的缺点是每次插入或者删除一个链结点的时候,要处理四个链结点的引用,而不是两个;两个链接前一个链结点,两个链接后一个链结点,由于多了两个引用,链结点的占用空间也变得大了一些 插入... 阅读详情

双向链表

管理单向链表的缺点:

单向链表,查找方向只能是一个方向,二双向链表可以此案前或者先后查找

单向链表不能自我删除,需要开辅助节点,二双向链表则可以自我删除,所以前边单链表删除时总要找到temp,temp时待删除节点的前一个节点

双向链表的增删改查

遍历

思路——方法同单向链表,就是循环打印

代码如下

public void list() {
		//判断链表是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode1 temp = head.next ;//因为头节点,不能动,因此我们需要一个辅助变量来遍历
		while(true) {
			//判断是否到链表最后
			if(temp == null) {
				break;
			}
			System.out.println(temp);//输出节点的信息
			temp = temp.next;//后移
		}
	}

添加

思路——首先要找到待添加的位置,然后让temp.next = HeroNode1;
HeroNode1.pre = temp;来完成添加

代码如下、

	//添加节点到单向链表;
	//思路,当不考虑编号顺序时
	//1.找到当前链表的最后节点
	//2.将最后这个节点的next指向新的节点
	//3。将新的节点的pre指向最后这个几点
	public void addNode(HeroNode1 HeroNode1) {
		HeroNode1 temp = head;//由于head节点不能动,找个变量辅助查找
		while(true) {//遍历链表,找到最后一个节点
			if(temp.next == null) {
				break;
			}
			temp = temp.next;//没有找到就将temp后移
		}
		temp.next = HeroNode1;
		HeroNode1.pre = temp;
	}

修改

思路——同单向链表一样的方法,就是先找到这个节点,在进行一系列的修改

代码如下

//修改节点的信息,根据no编号来修改,即no编号不能改
	
	public void update(HeroNode1 newHeroNode1) {
		//判断是否空
		if(head.next == null) {
			System.out.println("链表为空~"); 
			return;
		}
		//找到需要修改的节点,根据no编号
		//定义一个辅助变量
		HeroNode1 temp = head.next;
		boolean flag = false; //表示是否找到该节点
		while(true) {
			if (temp == null) {
				break; //已经遍历完链表
			}
			if(temp.no == newHeroNode1. no) {
				flag = true;
				break;
			}
			temp = temp.next;

		}
		//根据flag判断是否找到要修改的节点
		if(flag) {
			temp.name = newHeroNode1.name ;
			temp.nickname = newHeroNode1.nickname;
		} else { //没有找到
			System.out. printf("没有找到编号%d的节点,不能修改\n", newHeroNode1.no);
		}

	}
	

删除

思路——这里要好好想想,因为双向链表的特性有一个自我删除,temp.next.pre = temp.pre;temp.pre.next = temp.next;

这里特别要强调一句话,,由于我们不知道这个待删除的节点是不是最后一个节点,因为最后一个节点的next时一个空指针,.next.pre会导致空指针异常,所以我们需要判断一下时候这个节点是否为最后一个节点

操作方法如下:

if(temp.next != null){
	temp.next.pre = temp.pre;//如果是最后一个节点的话不执行这句话,否则空指针异常
}
	temp.pre.next = temp.next;

代码如下

//删除节点——双向链表
	//思路
	//1. head 不能动,因此我们需要一个temp辅助节点找到待删除节点
	//2. 找到后进行自我删除
	public void del(int no) {
		HeroNode1 temp = head.next;
		boolean flag = false; // 标志是否找到待删除节点的
		while(true) {
			if(temp == null) { //已经到链表 的最后
				System.out.println("链表为空");
				break;
			}
			if(temp.no == no) {
				//找到的待删除节点的前一个节点temp
				flag = true;
				break;
			}
			temp = temp.next; //temp后移, 遍历
		}
		//判断flag
		if(flag) {
			if(temp.next != null){
				temp.next.pre = temp.pre;//如果是最后一个节点的话不执行这句话,否则空指针异常
			}
			temp.pre.next = temp.next;
		}else {
			System.out.println("这个节点不存在");
		}
	}

在这里插入图片描述

完整代码

package linkedlist;

public class DoubleLinkedList {
	public static void main(String[] args) {
		//创建节点
				HeroNode1 hero1 = new HeroNode1(1, "11","111");
				HeroNode1 hero2 = new HeroNode1(2, "22","222");
				HeroNode1 hero3 = new HeroNode1(3, "33","333");
				HeroNode1 hero4 = new HeroNode1(4, "44","444");
				DoubleLinkedListTest singleLinkedListTest = new DoubleLinkedListTest();
				singleLinkedListTest.addNode(hero1);
				singleLinkedListTest.addNode(hero2);
				singleLinkedListTest.addNode(hero3);
				singleLinkedListTest.addNode(hero4);
				singleLinkedListTest.list();
				//创建节点2
//				HeroNode11 hero11 = new HeroNode11(1, "11","111");
//				HeroNode11 hero21 = new HeroNode11(2, "22","222");
//				HeroNode11 hero31 = new HeroNode11(3, "33","333");
//				HeroNode11 hero41 = new HeroNode11(4, "44","444");
//				DoubleLinkedListTest singleLinkedListTest2 = new DoubleLinkedListTest();
//				DoubleLinkedListTest.add(hero21);
//				DoubleLinkedListTest.add(hero11);
//				DoubleLinkedListTest.add(hero41);
//				DoubleLinkedListTest.add(hero31);
//				DoubleLinkedListTest.add(hero31);
//				DoubleLinkedListTest.list();
				//修改节点
				HeroNode1 hero311 = new HeroNode1(3, "331","3331");
				singleLinkedListTest.update(hero311);
				System.out.println("修改后");
				singleLinkedListTest.list();
				//删除节点
				
				singleLinkedListTest.del(4);
				System.out.println("删除后");
				singleLinkedListTest.list();
	}
}


class DoubleLinkedListTest{
	private HeroNode1 head = new HeroNode1(0,"","");//初始化的头节点不妨数据
	//显示链表[遍历]
	public void list() {
		//判断链表是否为空
		if(head.next == null) {
			System.out.println("链表为空");
			return;
		}
		HeroNode1 temp = head.next ;//因为头节点,不能动,因此我们需要一个辅助变量来遍历
		while(true) {
			//判断是否到链表最后
			if(temp == null) {
				break;
			}
			System.out.println(temp);//输出节点的信息
			temp = temp.next;//后移
		}
	}
	
	//添加节点到单向链表;
	//思路,当不考虑编号顺序时
	//1.找到当前链表的最后节点
	//2.将最后这个节点的next指向新的节点
	//3。将新的节点的pre指向最后这个几点
	public void addNode(HeroNode1 HeroNode1) {
		HeroNode1 temp = head;//由于head节点不能动,找个变量辅助查找
		while(true) {//遍历链表,找到最后一个节点
			if(temp.next == null) {
				break;
			}
			temp = temp.next;//没有找到就将temp后移
		}
		temp.next = HeroNode1;
		HeroNode1.pre = temp;
	}
	//修改节点的信息,根据no编号来修改,即no编号不能改
	
	public void update(HeroNode1 newHeroNode1) {
		//判断是否空
		if(head.next == null) {
			System.out.println("链表为空~"); 
			return;
		}
		//找到需要修改的节点,根据no编号
		//定义一个辅助变量
		HeroNode1 temp = head.next;
		boolean flag = false; //表示是否找到该节点
		while(true) {
			if (temp == null) {
				break; //已经遍历完链表
			}
			if(temp.no == newHeroNode1. no) {
				flag = true;
				break;
			}
			temp = temp.next;

		}
		//根据flag判断是否找到要修改的节点
		if(flag) {
			temp.name = newHeroNode1.name ;
			temp.nickname = newHeroNode1.nickname;
		} else { //没有找到
			System.out. printf("没有找到编号%d的节点,不能修改\n", newHeroNode1.no);
		}

	}
	
	//删除节点——双向链表
	//思路
	//1. head 不能动,因此我们需要一个temp辅助节点找到待删除节点
	//2. 找到后进行自我删除
	public void del(int no) {
		HeroNode1 temp = head.next;
		boolean flag = false; // 标志是否找到待删除节点的
		while(true) {
			if(temp == null) { //已经到链表 的最后
				System.out.println("链表为空");
				break;
			}
			if(temp.no == no) {
				//找到的待删除节点的前一个节点temp
				flag = true;
				break;
			}
			temp = temp.next; //temp后移, 遍历
		}
		//判断flag
		if(flag) {
			if(temp.next != null){
				temp.next.pre = temp.pre;//如果是最后一个节点的话不执行这句话,否则空指针异常
			}
			temp.pre.next = temp.next;
		}else {
			System.out.println("这个节点不存在");
		}
	}
	
}



//定义 HeroNode1节点
class HeroNode1{
	public int no;
	public String name;
	public String nickname;
	public HeroNode1 next;//下一个节点
	public HeroNode1 pre;//上一个节点
	
	public HeroNode1(int no, String name, String nickname) {
		this.no = no;
		this.name = name;
		this.nickname = nickname;
	}

	@Override
	public String toString() {
		return "HeroNode1 [no=" + no + ", name=" + name + ", nickname=" + nickname + "]" ;
	}
	
}
RSA 2048/4096 签名校验算法 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。 RSA是目前最有影响力和最常用的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。 今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能... 阅读详情

相关推荐

基于Cesium的北斗卫星轨道实时可视化系统开发实践

本文详细介绍了基于Cesium的北斗卫星轨道实时可视化系统开发实践,涵盖系统架构设计、轨道计算实现、后端服务开发及前端可视化实现等关键环节。通过优化算法和数据流设计,系统实现了厘米级精度的卫星轨道实时渲染,适用于导航卫星系统的科研与工程应用。

j7k8l的博客 520

Java——数据结构之双向链表

文章目录1.单链表的实现(1)定义一个节点类型(2)头插法(3)尾插法(4)根据下标插入节点(5)查找关键字(6)删除第一次出现的关键字(7)删除所有出现的关键字key(8)节点的回收(9)链表打印展示2.完整代码展示完!   接上篇Java——数据结构之单链表   在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是 在之后的 Java学习中,了解 基础 数据结构的知识 非常重要,数据结构的思想 可以帮助我们更加清晰 明白的了解 Java 的解题思路等等。   今天我们就来开始学习 实现一

rain67的博客 2657

从Mate到Mate40 Pro+:华为旗舰核心配置演进与选购避坑指南

本文回顾了华为Mate系列从初代到Mate40 Pro+的核心配置演进历程,重点分析了处理器性能、影像系统、屏幕设计及续航快充的技术突破。针对选购需求,提供了区分版本、5G选择及存储配置的实用避坑建议,帮助消费者明智选择华为旗舰机型。

weixin_30015371的博客 493

Java数据结构 双向链表

Java数据结构 双向链表 单链表       单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向表中的下一个节点,而最后一个节点则指向一个空值NULL。单向链表只可向一个方向遍历。       单链表的一个优点是结构简单,但是它也有一个缺点,即在单链表中只能通过一...

Zack_orz的博客 499

AI大模型应用性能核心指标:TTFT 与 TPOT 详解

这两个指标专门衡量大模型流式响应性能,是评估用户体验的关键指标。· 是什么:从请求到第一个输出的等待时间· 为什么重要:决定用户的第一印象和响应感知· 优化方向:模型加载、预处理、冷启动优化· 行业标准:最好<500ms,可接受<1.5s· 是什么:每个输出token的平均生成时间· 为什么重要:决定流式输出的流畅度和总完成时间· 优化方向:推理引擎、内存带宽、批处理优化· 行业标准:最好<50ms/token,可接受<100ms/token在Dify/大模型应用中的意义。

lovehu6686的博客 3940

伺服电机入门01

编码器输出 旋转信号 , 接收端: 使用ADC 捕捉旋转信号 ,转成数字信号,驱动器得到数字处理, 因为信号量是模拟信号, mcu mpu 等芯片通常内部处理是数字,通过adc 得到数字cpu 才能识别 传输过来的pos 等信息。IPM 芯片示例, IRAM256A 这个芯片已经停产,有换新的,,下面示例来自stmbl 高功率方案,4 步进电机 有全步控制,半步控制 ,微步控制,FOC控制,步进电机也是可以做伺服系统的。以下面几种信号是可以细分,也就是通过细分增加编码器的分辨率,

qq_25160559的博客 968

【数据结构 3】双向链表及其Java实现

一、双向链表 1.1 简介 双向链表也叫双向表,是链表的一种,它由多个结点组成,每个结点都由一个数据域和两个指针域组成,数据域用来存储数据,其中一个指针域用来指向其后继结点,另一个指针域用来指向前驱结点。 链表的头结点的数据域不存储数据,指向前驱结点的指针域值为null,指向后继结点的指针域指向第一个真正存储数据的结点。 1.2 结点API设计 类名 Node 构造方法 Node(T t,Node pre,Node next):创建Node对象 成员变量 1 T item:存储数据

Java技术工坊 479

【编译原理】LL(1)分析方法 生成语法树(c++实现)

基本流程 输入文法->消除左递归->提取左公共因子->求FIRST集->求FOLLOW集->LL(1)分析表->表驱动的预测语法分析过程->输出语法分析结果和语法树

qq_43417265的博客 1万+

java数据结构之双向链表

public class DoubleLinkedList<E> { private Node first;//指向第一个元素 private Node last;//指向最后一个元素 private int length=0;//链表长度 class Node { private Node previous; priva...

qq_30242987的博客 189

Ceres&OpenCV 单目相机标定(论文复现)

Ceres&OpenCV 单目相机标定(论文复现)

dayuhaitang1的博客 367

RK3588开发笔记-MIPI-CSI接口视频解码芯片XS9922B调试

Rockchip RK3588 是一款高性能的处理器,支持多种摄像头接口,包括 MIPI(Mobile Industry Processor Interface)接口。MIPI是一种用于移动设备和嵌入式系统中的摄像头、显示器和其他传感器设备的串行接口标准。MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准。CSI-2(Camera Serial Interface 2)是MIPI 联盟定义的另一种高速接口,主要用于摄像模组和处理器之间的连接。

flypig has a dream! 6860

java双向链表结构_Java数据结构——双向链表

背景问题:1、管理单向链表查找的方向只能有一个。2、单向链表不能自我删除,删除不方便双向链表示意图注意:每一个双向链表都有两个头节点,一个pre(指向前一个节点);next(指向后一个节点)双向链表的增删改查增加数据:思路:1、先遍历双线链表找到最后一个节点(temp)2、temp.next = newHeroNode3、newHeroNode.pre = temp删除数据:思路:遍历双向链表,找...

weixin_29037455的博客 175

ROS机器人未知环境自主探索功能包explore_lite最全源码详细解析(一)

本系列文章主要针对ROS机器人常使用的未知环境自主探索功能包explore_lite展开全源码的详细解析,并进行概括总结。 本系列文章共包含六篇文章,前五篇文章主要介绍explore_lite功能包中 explore.cpp、costmap_tools.h、frontier_search.cpp、costmap_client.cpp等源码实现文件中全部函数的详细介绍,第六篇文章进行概括总结,包含自主探索功能包explore_lite的简介,实现未知环境自主探索功能的原理及流程总结,效果演示,使用功能包

慕羽★的博客 3935

java 双向链表结构_Java 数据结构 双向链表

Java 数据结构 双向链表基本特点单向链表:只有指向下一个结点的引用(后驱)双向链表:既有指向下一个结点的引用(后驱),也有指向上一个结点的引用(前驱)优点双向链表在查找元素的时候,速度比之单向链表会更快拥有前驱后驱,操作更灵活缺点增加删除结点操作更繁琐一些占用的资源更多,数据存储率相比单向链表更低(生产中使用单链表比双链表更多)存储结构在这里插入图片描述Java代码package linkli...

weixin_28753113的博客 299

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

数据结构--双向链表(Java)

数据结构–双向链表(Java) 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点 图示 代码 package link; public cla...

归子莫的博客 417

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

JAVA数据结构--LinkedList双向链表

JAVA数据结构--LinkedList双向链表 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。...

三分自留地 319

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java数据结构,双向链表的实现

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。DoubleListNode.java为结构体类,DoubleLinkedList.java为实现类,MyList.java为方法接口。设置head和last两个哑元(其数据域并不存放数据),只是为了方便插入删除。双链表,需要一个指向前驱的指针,后指向后继元素的指针,以及数据域。插入的话,需要修改四个指针指向(修改顺序具有一定的规则!

m0_63622279的博客 649

java双向链表结构_【数据结构】双向链表(java)

(本文参考此博客)一.双向链表的结构:二.双向链表的优点:1.插入节点和删除节点简单。2.可双向遍历。三.双向链表的java实现:class DoubleLinkedList{DoubleLinkedList pre;DoubleLinkedList next;int val;static DoubleLinkedList head;static DoubleLinkedList tail;pub...

weixin_28869849的博客 194

数据结构之双向链表详细(java版)

前言 双向链表是一种线性表,常见的线性表还有单向链表、栈、队列,本篇主要是分析双向链表的结构,以及如何使用java自己实现一个双向链表。 1、单向链表 在分析双向链表前,有必要先看看单向链表的结构图,方便对比双向链表数据结构。 ...

夏夜凉月 697

Java数据结构之双向链表

使用Java实现双向链表,并且使用Iterable接口来实现双向链表的遍历

timewilltell12的博客 662

java 数据结构与算法——链表(双向链表)

java 数据结构与算法——链表(双向链表) 单向链表的缺点分析 对上图分析: 1)遍历方法和单链表一样,只是可以向前,也可以向后 2)添加 (1)先找到双向链表的最后一个节点 (2)让最后一个节点的next指向添加的节点temp.next = heroNode (3)让添加的节点的pre指向最后一个节点heroNode.pre = temp 3)插入跟单链表大致相同,只需将插入节点的pre与前后节点相连接即可 4)修改的思路和单链表相同 5)删除 (1)因为是双向来链表,因此,我们可以自我删除某个节点

weixin_43825740的博客 294

java 双向链表_Java数据结构之链表的原理及LinkedList的部分源码剖析

一、为什么要学习数据结构?做为一名程序员,不管你是用什么编程语言,数据结构是取底层的东西。就相当于盖楼的地基一样,地基做不好,上边再好也没有用。在高级语言中,一般会对这些基础的数据结构进行封装,我们学要学习这些基础的东西吗? 当然是的,只有知道这些基础的东西,我们才能更好地使用语言封装好的api。举个最简单的例子,在Java中,List的实现类有ArrayList,LinkedList,Vecto...

weixin_39603823的博客 134

Java数据结构-双向链表的实现

我们将从以下几点开始阐述: 双向链表的概述 🔜 单双链表之间的区别 🔜 双向链表的实现思路🔜 双向链表的代码实现与分析🔜 结论

算法萌新一枚 1114

Java数据结构--双向链表

Java数据结构–双向链表 双向链表类 import java.util.Iterator; public class TowWayLinkList<T> implements Iterable<T> { private class Node<T> { private T item; private Node<T> next; private Node<T> pre;

weixin_44808225的博客 195

Java 数据结构之双向链表

线性表链式存储结构:将采用一组地址的任意的存储单元存放线性表中的数据元素。 链表又可分为: 单链表:每个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头结点,尾节点的next引用为null。 循环链表:一种首尾相连的链表。 双向链表:每个节点有两个引用,一个指向当前节点的上一个节点,另外一个指向当前节点的下一个节点。 下面给出线性表双向链表的实现:java中Link...

muranfei的博客 296

java数据结构之--双向链表

链表,双向链表

wcguang博客 585
上一篇: 数据结构(Java)——链表面试题
下一篇: 数据结构(Java)——约瑟夫问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

痞子三分冷ゾジ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值