线性表的链式存储结构————双链表(java)

线性表的链式存储结构————双链表(java)

文章目录

  • 线性表的链式存储结构————双链表(java)
    • 双链表
    • 双链表的创建
    • 插入数据元素
      • 头插法
      • 尾插法
    • 求链表的长度
    • 输出双链表
    • 删除双链表中的指定元素
    • 总代码
    • 运行效果
    • 用Java内部类实现双链表
    • 结语

嗨!收到一张超级美丽的风景图,愿你每天都能顺心!
在这里插入图片描述

双链表

在双链表中,由于每个结点既包含一个指向后续结点又包含一个指向前驱结点,所以当访问过一个结点后既可以向后访问每一个结点,也可以一次向前访问每一个结点。因此与单链表相比,在双链表中访问一个结点的前后结点更方便。
在这里插入图片描述

双链表的创建

    private Node head;private Node tail;private static class Node {int data;Node next;Node prev;public Node(int data) {this.data = data;this.next = null;this.prev = null;}}
  • private Node head;:这是一个私有成员变量,表示链表的头节点。头节点是链表中的第一个节点。
  • private Node tail;:这是一个私有成员变量,表示链表的尾节点。尾节点是链表中的最后一个节点。
  • private int size;:这是一个私有成员变量,表示链表中节点的数量。
  • int data;:存储节点中的数据。
  • Node next;:指向链表中下一个节点的引用。如果当前节点是链表的最后一个节点,则此引用为null。
  • Node prev;:指向链表中前一个节点的引用。如果当前节点是链表的第一个节点,则此引用为null。

Node类的构造函数接受一个整数参数data,并将其赋值给节点的成员变量data。同时,它将next和prev初始化为null,表示这个节点目前没有连接到任何其他节点。

插入数据元素

头插法

在这里插入图片描述

  • 插入数据首先要判断链表是否为空。
  • 如果是空链表头结点=插入的结点=尾结点。
  • 不为空将则将插入节点next指向头结点
  • 调整首结点的前驱为新结点
  • 将新结点设置为首结点
  • 链表长度+1
    public void insertHead(int data){Node newNode = new Node(data);if (head != null) {head.prev = newNode;newNode.next = head;}head = newNode;}

尾插法

在这里插入图片描述
47a11.png#pic_center)

  • 插入数据首先要判断链表是否为空。
  • 如果是空链表头结点=插入的结点=尾结点。
  • 不为空将则将插入节点prev指向尾结点
  • 调整尾结点的后继为新结点
  • 将新结点设置为尾结点
  • 链表长度+1
public void insertTail(int data){Node newNode = new Node(data);if(head == null){head = newNode;}else {tail.next = newNode;newNode.prev = tail;}tail = newNode;}

求链表的长度

要计算双链表的长度,可以遍历整个链表并计数节点的数量。

    public int length(){int size = 0;Node current = head;while (current != null){size++;current = current.next;}return size;}public void len(){int size = length();System.out.println(size);}

输出双链表

    public void print(){Node current = head;while (current != null){System.out.print(current.data + " ");current = current.next;}System.out.println();}

删除双链表中的指定元素

在这里插入图片描述
e.png#pic_center)

  • 定义一个名为delete的公共方法,接收一个整数类型的参数data,表示要删除的节点的数据值。
    初始化一个名为current的变量,将其设置为链表的头节点(head)。
  • 使用一个while循环遍历链表,直到current变为null(即到达链表尾部)。
  • 在循环内部,检查当前节点的数据值是否等于要删除的数据值(current.data == data)。
  • 如果找到了匹配的节点,执行以下操作: a. 如果当前节点不是头节点(即current.prev != null),则将当前节点的前一个节点的next指针指向当前节点的下一个节点(current.prev.next = current.next)。 b. 如果当前节点是头节点(即current.prev == null),则将链表的头节点更新为当前节点的下一个节点(head = current.next)。 c. 如果当前节点不是尾节点(即current.next != null),则将当前节点的下一个节点的prev指针指向当前节点的前一个节点(current.next.prev = current.prev)。
  • 完成删除操作后,直接返回,不再继续遍历链表。
    如果遍历完整个链表都没有找到匹配的节点,那么函数什么也不做,自然结束。
    public void delete(int data){Node current = head;while (current != null){if(current.data == data){if(current.prev != null){current.prev.next = current.next;}else {head = current.next;}if(current.next != null){current.next.prev = current.prev;}return;}current = current.next;}}

总代码


public class Dnode {private Node head;private Node tail;private static class Node{int data;Node next;Node prev;public Node(int data){this.data = data;this.next = null;this.prev = null;}}//尾插法public void insertTail(int data){Node newNode = new Node(data);if(head == null){head = newNode;}else {tail.next = newNode;newNode.prev = tail;}tail = newNode;}//长度public int length(){int size = 0;Node current = head;while (current != null){size++;current = current.next;}return size;}public void len(){int size = length();System.out.println(size);}public void print(){Node current = head;while (current != null){System.out.print(current.data + " ");current = current.next;}System.out.println();}//删除指定元素public void delete(int data){Node current = head;while (current != null){if(current.data == data){if(current.prev != null){current.prev.next = current.next;}else {head = current.next;}if(current.next != null){current.next.prev = current.prev;}return;}current = current.next;}}public static void main(String[] args) {Dnode list = new Dnode();list.insertTail(1);list.insertTail(2);list.insertTail(3);list.insertTail(4);list.print();list.len();list.delete(2);list.print();}
}

运行效果

在这里插入图片描述

用Java内部类实现双链表

我们除了自己手写双链表外,Java还提供了一个类来帮助我们快速实现双链表(LinkedList)

API网址
https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/LinkedList.html

在这里插入图片描述

在这里插入图片描述

我们直接调用我们需要的方法即可。

import java.util.LinkedList;public class Dnode {public static void main(String[] args) {// 创建一个空的双链表LinkedList<Integer> Dnode = new LinkedList<>();Dnode.addLast(1);Dnode.addLast(2);Dnode.addLast(3);Dnode.addLast(4);Dnode.addLast(5);StringBuilder output = new StringBuilder();for(int value:Dnode){output.append(value).append(" ");}System.out.print(output);}
}

由于直接调用的输出格式是列表的格式,所以想直接输出数字,就将其转换为字符串,并遍历循环输出。其他更多的功能大家也可以自己去尝试一下。

结语

本次分享就到这里了,感谢小伙伴的浏览,如果有什么建议,欢迎在评论区留言,如果给小伙伴们带来了一些收获,请留下你的小赞,你的点赞和关注将会成为博主分享每日学习的动力。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在组件中显示tuku的照片

一、问题 &#xff08;1&#xff09;错误&#xff1a;域名前面一定要加http://要不然会报错 &#xff08;2&#xff09;在使用 defineModel传值时一定要动态绑定&#xff0c;要不然图片不显示 &#xff08;3&#xff09;改完后在商品列表中显示图片信息必须 在显示的图片中取…

基于天地图使用Leaflet.js进行WebGIS开发实战

目录 前言 一、天地图的key 1、创建应用 2、调用限制策略 注&#xff1a; &#xff08;1&#xff09;日服务调用超量会暂时拒绝访问&#xff0c;次日自动开启&#xff1b; &#xff08;2&#xff09;如果服务调用过程中存在数据爬取或者下载行为&#xff0c;服务调用会被自…

ssh -D 选项用于动态(Dynamic)端口转发

举例实现不同ssh连接功能目录 一、功能简介 -D 支持 SOCKS5 协议&#xff0c;可以同时转发 TCP 和 UDP 报文 二、原理介绍 假设拥有三台主机&#xff0c;具体环境如下&#xff1a; 1. 主机 A&#xff1a;本地主机&#xff0c;即 SSH 客户 所在的主机&#xff0c;IP&#xff1…

C语言switch的使用

switch的使用语句 switch&#xff08;表达式&#xff09; { case 值1&#xff1a; 语句1; break; case 值2&#xff1a; 语句2; break; default: break; } 注意事项&#xff1a;1.表达式计算结果只能为&#xff08;字符/整数&#xff09; 2.case值只能是&#xff08;字…

最大文件句柄数

优质博文&#xff1a;IT-BLOG-CN 灵感来源 一、什么是文件句柄 文件句柄File Handle是操作系统中用于访问文件的一种数据结构&#xff0c;通常是一个整数或指针。文件句柄用于标识打开的文件&#xff0c;每个打开的文件都有一个唯一的文件句柄。 它们是对文件、网络套接字或…

哪些工科专业要学C语言或C++?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「c&#xff0b;&#xff0b;的资料从专业入门到高级教程」&#xff0c;点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;工科专业…

鸿蒙语言基础类库:【@system.configuration (应用配置)】

应用配置 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口[ohos.i18n]和[ohos.intl]。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import configurati…

网安小贴士(19)入侵检测技术原理与应用

前言 入侵检测技术&#xff08;Intrusion Detection System, 简称IDS&#xff09;是一种用于监测和防止计算机网络中的恶意活动的安全系统。它通过收集系统状态信息、特征提取、建立模型、入侵检测以及反馈更新等步骤&#xff0c;及时检测网络和系统中可能遭受攻击的迹象并发出…

python项目为什么用WSGI

小背景 Java用的时间久了&#xff0c;web项目启动的时候直接启动主程序就行&#xff0c;因为spring web项目内置了Tomcat web服务器&#xff0c;服务器的配置一般也是采用默认的配置&#xff0c;所以很少关注底层实现&#xff0c;关注点主要在应用程序功能。 初学python的时候…

打破运维“冷门槛“|暴雨液冷数据中心方案再升级

如果将数据比喻为驱动世界运转的新引擎&#xff0c;那数据中心便是为引擎提供源源不断动力的泵站。但随着泵站功率的日益增强&#xff0c;热浪成了不可避免的副产品。如何将数据热能转化为科技动能&#xff0c;是人工智能可持续发展的重要前提。 液冷技术&#xff0c;不仅可实现…

视频素材网站无水印的有哪些?热门视频素材网站分享

当我们走进视频创作的精彩世界时&#xff0c;一个难题常常摆在面前——那些高品质、无水印的视频素材究竟应该在哪里寻找&#xff1f;许多视频创作者感叹&#xff0c;寻找理想的视频素材难度甚至超过了寻找伴侣&#xff01;但不用担心&#xff0c;今天我将为您介绍几个优质的视…

人工智能导论-确定性推理

确定性推理 概述 上一章&#xff1a;讨论了“知识与知识表示”&#xff0c;可以把知识用某种模式表示出来存储到计算机中&#xff0c;但为使计算机具有智能&#xff0c;还必须使它具有思维能力。 本章&#xff1a;1&#xff09;推理是求解问题的一种重要方法。因此&#xff…

对消息队列进行深入学习

目录 1.什么是消息队列。1.1消息队列1.1.1同步的理解1.1.2异步的理解 1.2消息传递与消息队列 2. 消息队列应用场景2.1 异步处理2.2 流量削锋2.3 应用解耦2.4 日志处理2.5 消息通讯2.6 延时任务2.7 广播消费2.8 分布式事务 3. 主流消息队列3.1 RabbitMQ3.1.1 RabbitMQ工作原理3.…

win11家庭版怎么升级专业版

随着Windows 11的推出&#xff0c;许多用户享受到了全新的用户界面和功能。然而&#xff0c;Windows 11家庭版在某些高级功能上有所限制&#xff0c;例如&#xff0c;组策略管理、远程桌面连接等。为了满足更多的工作需求&#xff0c;许多用户希望将Windows 11家庭版升级到专业…

2024高考大数据出炉!考生偏爱南方高校,计算机专业热度下降!

近日&#xff0c;百度携手中国教育在线共同发布了名为**《百度热搜・2024高考大数据》**的报告&#xff0c;这份报告详细揭示了2024年广大考生最感兴趣的高校和专业等关键信息。 与去年相比&#xff0c;今年的高考人数和关注度均有所上升。据报告透露&#xff0c;百度上关于高…

小程序-模板与配置

一、WXML模板语法 1.数据绑定 2.事件绑定 什么是事件 小程序中常用的事件 事件对象的属性列表 target和currentTarget的区别 bindtap的语法格式 在事件处理函数中为data中的数据赋值 3.事件传参与数据同步 事件传参 &#xff08;以下为错误示例&#xff09; 以上两者的…

搭建调用链监控Zipkin和Sleuth

项目环境: win7、jdk8 1、添加依赖&#xff0c;添加了spring-cloud-starter-zipkin会自动导入Sleuth <!--Sleuth&#xff0c;zipkin--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</…

算法第十天:leetcode203.移除链表元素

一、203.移除链表元素题目描述 203.移除链表元素的链接如下所示&#xff0c;您可复制下面链接网址进入力扣学习&#xff0c;看题解之前一定要先做一遍哦&#xff01; https://leetcode.cn/problems/remove-linked-list-elements/description/https://leetcode.cn/problems/rem…

电商库存API设计与实现详解

库存管理在电商运营中非常重要&#xff0c;因为这影响到电商交易是否能够顺利进行。很多从线下零售发展到电商渠道的朋友了解到了电商库存接口能够高效管理库存&#xff0c;但不知道自己想要应用的场景是否仅通过电商库存接口就能实现&#xff0c;那不妨先了解一下电商库存接口…

Jupyter Notebook安装及基本使用

Jupyter Notebook安装及基本使用 目录 Jupyter Notebook安装及基本使用方式一&#xff1a;Anaconda直接安装方式二&#xff1a;pip命令安装Jupyter使用虚拟环境 方式一&#xff1a;Anaconda直接安装 安装Anaconda 下载地址&#xff0c;输入邮箱&#xff0c;Windows下载 开始安…