【数据结构(三)】双向链表(2)

文章目录

  • 1. 基本概念
  • 2. 管理双向链表的思路
  • 3. 代码实现


1. 基本概念

管理单向链表的缺点分析:

    ①单向链表,查找的方向只能是一个方向,而双向链表可以向前或者向后查找
    ②单向链表不能自我删除,需要靠辅助节点 ,而双向链表,则可以自我删除,所以前面我们单链表删除时节点,总是找到 temp(temp 是待删除节点的前一个节点)。

双向链表示意图:

在这里插入图片描述

2. 管理双向链表的思路

一、遍历:

    和单向链表一样,可以向前,也可以向后查找。

二、添加:

默认添加到双向链表的最后

在这里插入图片描述

    ①先找到链表的最后一个节点
    ②temp.next = newHeroNode
    ③newHeroNode.pre = temp

三、修改:

思路和原理与单向链表一样

四、删除:

因为是双向链表,因此,可以实现自我删除某个节点

在这里插入图片描述

    ①直接找到要删除的这个节点,比如temp
    ②temp.pre.next = temp.next
    ③temp.next.pre = temp.pre

3. 代码实现

package Linkedlist;public class DoubleLinkedListDemo {public static void main(String[] args) {//创建节点HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");HeroNode2 hero4 = new HeroNode2(4, "林冲", "豹子头");//创建一个双向链表对象DoubleLinkedList doubleLinkedList = new DoubleLinkedList();doubleLinkedList.add(hero1);doubleLinkedList.add(hero2);doubleLinkedList.add(hero3);doubleLinkedList.add(hero4);//输出doubleLinkedList.list();//修改HeroNode2 newHeroNode = new HeroNode2(4, "公孙胜", "入云龙");doubleLinkedList.update(newHeroNode);System.out.println("修改后的链表情况");doubleLinkedList.list();//删除doubleLinkedList.del(3);System.out.println("删除后的链表情况");doubleLinkedList.list();}
}//创建一个双向链表的类
class DoubleLinkedList {//先初始化一个头节点,头节点不要动,不存放具体数据private HeroNode2 head = new HeroNode2(0, "", "");//返回头节点public HeroNode2 getHead(){return head;}//遍历双向链表的方法//显示链表[遍历]public void list(){//先判断链表是否为空if(head.next == null){System.out.println("链表为空");return;}//因为头节点不能动,每个HeroNode对象就是一个节点HeroNode2 temp = head.next;while (true) {//判断是否到链表最后if(temp == null){break;}//输出节点的信息System.out.println(temp);//将next后移。(不后移就成了死循环,一定小心)temp = temp.next;            }}    //添加一个节点到双向链表的最后public void add (HeroNode2 heroNode){//因为head节点不能动,因此我们需要一个辅助遍历tempHeroNode2 temp = head;//遍历链表,找到最后while (true) {//找到链表最后if(temp.next == null){break;}//如果没有找到 最后,将temp后移temp = temp.next;}//当退出while循环时,temp就指向了链表的最后//形成一个双向链表temp.next = heroNode;heroNode.pre = temp;}//修改一个节点的内容,可以看到双向链表的节点内容修改和单向链表一样public void update(HeroNode2 newHeroNode) {//判断是否空if(head.next == null) {System.out.println("链表为空~");return;}//找到需要修改的节点, 根据 no 编号//定义一个辅助变量HeroNode2 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. 对于双向链表,我们可以直接找到要删除的这个节点//2. 找到后,删除即可public void del(int no){//判断当前链表是否为空if(head.next == null){System.out.println("链表为空,无法删除");return;}HeroNode2 temp = head.next;boolean flag =false;//标识是否找到待删除的节点while(true){if(temp == null){//已经到链表的最后节点的nextbreak;}if(temp.no == no){//找到的待刪除节点的前一个节点tempflag = true;break;}temp = temp.next;//temp后移}//判断flagif(flag){//找到//可以删除// temp.next = temp.next.next;//单向链表temp.pre.next = temp.next;//问题:如果是最后一个节点,就不需要执行下面这句话,否则出现空指针if (temp.next != null) {temp.next.pre = temp.pre;}temp.next.pre = temp.pre;}else{System.out.printf("要删除的 %d 节点不存在\n", no);}}    }//定义一个 HeroNode2,每个 HeroNode 对象就是一个节点
class HeroNode2 {public int no;public String name;public String nickname;public HeroNode2 next;//指向下一个节点,默认nullpublic HeroNode2 pre;//指向前一个节点,默认null//构造器public HeroNode2(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 = " + next + "]";return "HeroNode [no = " + no + ", name = " + name + ", nickname = " + nickname + "]";}
}

运行结果:

在这里插入图片描述


课后作业:
双向链表的第二种添加方式,按照编号顺序 [示意图]按照单链表的顺序添加,稍作修改即可.

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

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

相关文章

三柱汉诺塔

题目描述 汉诺塔是约19世纪末,在欧州的商店中出售一种智力玩具。它的结构如下图所示: 在一个平板上立有三根铁针,分别记为A, B, C。开始时,铁针 A 上依次叠放着从大到小 n 个圆盘,游戏的目标就是将 A 上的 n 个圆盘…

vivado调试核ILA使用技巧

ILA(Integrated Logic Analyzer)IP Core 是 vivado 的调试核,具体如何创建、调用就不详说了。这里主要记录一个 ILA 的使用技巧,可以大大提高调试效率。 在 Program Device 后,如果添加了 ILA 核,则会出现以…

在有springSecurity或者若依项目中获取当前系统登录的用户信息

方法一(springSecurity自带的) AuthenticationPrincipal 是 Spring Security 框架中的一个注解,用于获取当前已认证用户的 principal(即用户身份信息)。 方法二(若依项目自带的) (1…

如何有效解决UDP协议传输问题实现快速安全的文件传输

随着互联网技术的不断发展,UDP协议作为一种快速、简单的传输协议被广泛应用于文件传输领域。然而,UDP协议传输过程中也存在着一些问题,如传输速度不稳定、数据丢失等,这些问题会影响到文件传输的效率和安全性。本文将介绍UDP协议传…

windows 查看防火墙设置命令使用方法

点击键盘上windows键,输入cmd,选择以管理员身份运行 输入下面命令查看使用说明 netsh advfirewall firewall add rule ? 发现显示不全,不方便看 可以输入下面命令,生成文件,方便查看 netsh advfirewall firewall ad…

webshell之无扩展免杀

1.php加密 这里是利用phpjiami网站进行加密,进而达到加密效果 加密前: 查杀效果 可以看到这里D某和某狗都查杀 里用php加密后效果 查杀效果 可以看到这里只有D某会显示加密脚本,而某狗直接绕过 2.dezend加密 可以看到dezend加密的特征还是…

【开源】基于Vue.js的康复中心管理系统

项目编号: S 056 ,文末获取源码。 \color{red}{项目编号:S056,文末获取源码。} 项目编号:S056,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员…

不存在类型变量 A, T 的实例,使 Collector<T, A, List<T>> 符合 Supplier<R>

报错信息 原因: 不存在类型变量 A, T 的实例&#xff0c;使 Collector<T, A, List<\T>> 符合 Supplier<\R> 来源 测试Stream流的map方法&#xff0c;做算法习惯基本类型定义数组。 map方法:Stream API的一部分。允许以一种声明式的方式处理数据&#xff0c…

2 Advanced Learning Algorithms

文章目录 Week1Neurons and brainNeural network layerForward propagationBuild a netural network ------codeAGIMatrix multiplication ------code Week2Tensorflow--- training detailsactivation functionsMultclass and SoftmaxClassification with multiple outputsAdam…

《算法通关村——幂运算问题解析》

《算法通关村——幂运算问题解析》 2 的幂 给你一个整数 n&#xff0c;请你判断该整数是否是 2 的幂次方。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 如果存在一个整数 x 使得 n 2x &#xff0c;则认为 n 是 2 的幂次方。 示例 1&#xff1…

网站被攻击了怎么办,有什么办法防御攻击?

近年来&#xff0c;随着互联网发展&#xff0c;出现了各种各样的网站&#xff0c;web应用&#xff0c;网络极大方便了人们的生活&#xff0c;改变了人们生活方式。而随着网络的发展普及&#xff0c;网络安全问题也困扰着用户。 许多人都曾有过这样经历&#xff0c;网站上线后&…

【项目管理】甘特图(1)——认识甘特图

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天学习下甘特图的绘制&#xff0c;以下为学习笔记。 一、什么是甘特图 甘特图是可以直观展示项目进展随时间走势和联系的条状图。是一种常见的项目管理工具。 项目的时间用横轴表示&#xff0c;项目的进度用纵轴表…

灾备建设中,跨主机集群恢复技术应用

在介绍跨主机集群恢复之前&#xff0c;要了解到虚拟化主机集群是什么&#xff1f; 虚拟化主机集群是一种把一组主机组合起来形成一个整体&#xff0c;向用户提供资源方式&#xff08;计算存储、存储资源、网络资源&#xff09;的技术。 虚拟化集群具有以下特性&#xff1a; …

漏洞复现--捷诚管理信息系统多处SQL注入

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

HSV映射到圆锥坐标系

def bgr2hsvcone(img):arr_hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV)h arr_hsv[..., 0] / 180. * 2s arr_hsv[..., 1] / 255.v arr_hsv[..., 2] / 255.x np.cos(h * np.pi) * s * vy np.sin(h * np.pi) * s * vreturn np.stack((x, y, v), axis-1)

【ThingJS】类型转换以及注册

前言 目前国家提倡加快数字化发展&#xff0c;建设数字中国&#xff0c;并于今年2月份中共中央、国务院印发的《数字中国建设整体布局规划》中明确&#xff0c;数字中国建设按照“2522”的整体框架进行布局。其中提到“构建以数字孪生流域为核心的智慧水利体系”&#xff0c;可…

谷歌Freshness新鲜度算法:如何利用它提升网站排名?

今天我们就来深入了解下Google Freshness算法核心&#xff0c;结合案例研究和实用技巧&#xff0c;为我们自己的网站优化提供一些思路。 Google新鲜度算法和QDF Google的新鲜度算法和查询需求的新鲜度&#xff08;Query Deserves Freshness, QDF&#xff09;模型是为了改善特…

从 PUGC 到 SGC,普通店员也能用 AI 运营「粉丝群」

同一种文案风格反复使用&#xff0c;商品展示图也单调雷同&#xff0c;要直播时就直接「扔」个链接&#xff0c;社群、朋友圈这些品牌的私域重地有时极易被忽视&#xff0c;而变得千篇一律、简单粗暴。 但是&#xff0c;以内容驱动业务增长&#xff0c;已经成为越来越多品牌在做…

【代码随想录】刷题笔记Day32

前言 实在不想做项目&#xff0c;周末和npy聊了就业的焦虑&#xff0c;今天多花点时间刷题&#xff01;刷刷刷刷&#xff01; 93. 复原 IP 地址 - 力扣&#xff08;LeetCode&#xff09; 分割startindex类似上一题&#xff0c;难点在于&#xff1a;判断子串合法性(0~255)、&…

云原生入门系列(背景和驱动力)

做任何一件事&#xff0c;或者学习、应用一个领域的技术&#xff0c;莫过于先要想好阶段的目标和理解、学习它的意义是什么&#xff1f;解决了什么问题&#xff1f; 这部分&#xff0c;就尝试来探讨下这个阶段需要理解并达成的目标以及践行云原生的意义在哪里。 1.历程 任何阶…