线性表的链式存储结构————双链表(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.rhkb.cn/news/378549.html

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

相关文章

[HCTF 2018]WarmUp1

进入靶场&#xff0c;检查代码看到有source.php,访问 /source.php 读代码&#xff0c;在参数中传入 file&#xff0c;通过checkFile后&#xff0c;会加载file界面。 再看checkFile&#xff0c; 第一个判断&#xff0c;是非空并且是个字符串&#xff0c;否则返回false 第二个判…

小程序里面使用vant ui中的vant-field组件,如何使得输入框自动获取焦点

//.wxml <van-fieldmodel:value"{{ userName }}"placeholder"请输入学号"focus"{{focusUserName}}"/>// .js this.setData({focusUserName: true});vant-field

华为OD算法题汇总

60、计算网络信号 题目 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。注意:网络信号可以绕过阻隔物 array[m][n]&#xff0c;二维数组代表网格地图 array[i][j]0&#xff0c;代表i行j列是空旷位置 a…

快捷:通过胶水语言实现工作中测试流程并行、加速

通过胶水语言实现工作中测试流程并行、加速 通过胶水语言实现工作中测试流程并行、加速工作场景&#xff08;背景&#xff09;问题抽象&#xff08;挑战&#xff09;如何做&#xff08;行动&#xff09;获得了什么&#xff08;结果&#xff09;后记相关资源 通过胶水语言实现工…

唐刘:当 SaaS 爱上 TiDB(一)- 行业挑战与 TiDB 的应对之道

导读 在 TiDB 8.1 发布后&#xff0c;TiDB 展现了强大的支持 SaaS 业务的能力&#xff0c;成为 SaaS 业务数据库的优先选择之一。 本文为“当 SaaS 爱上 TiDB”系列文章的第一篇&#xff0c;系列文章将从技术原理和真实用户体验两个角度深入探讨 TiDB 在 SaaS 业务中的表现&a…

qt 创建一个左侧边线拖拽的矩形

1.概要 2.代码 在Qt中&#xff0c;如果你想要创建一个矩形&#xff0c;并且仅允许通过拖拽其左侧边线来改变宽度&#xff0c;你可以通过重写QGraphicsRectItem类来实现。以下是一个简单的例子&#xff0c;展示了如何创建一个自定义的ResizableRectItem类&#xff0c;该类允许…

责任链模式+CompletableFuture异步处理

1、查询商品基础信息 2、查询商品价格 3、查询商品活动 4、查询商品库存 假设这几个服务逻辑比较独立&#xff0c;其实是可以并行调用&#xff0c;我们可以结合责任链模式和CompletableFuture进行优化: 下面是代码示例: Service public class ChainFactory {// 原型模式获取对…

GloVe: Global Vectors for Word Representation论文笔记解读

基本信息 作者Jeffrey Penningtondoi10.3115/v1/D14-1162发表时间2014期刊EMNLP网址https://aclanthology.org/D14-1162.pdf 研究背景 1. What’s known 既往研究已证实 全局矩阵分解方法&#xff1a;LSA&#xff0c;考虑整个语料库词频的统计信息得到共现矩阵&#xff0c;通…

Spring Security学习笔记(一)Spring Security架构原理

前言&#xff1a;本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 Spring Security中文文档&#xff1a;https://springdoc.cn/spring-security/index.html 一、什么是Spring Security Spring Security是一个安全控制相关的java框架&#xff0c;它提供了一套全…

昇思25天学习打卡营第1天 | 基本介绍

打卡&#xff1a; 小白一个&#xff0c;第一次接触昇思MindSpore&#xff0c;之前使用chatgpt较多一点。这次相当于从使用着角色转换成制作者的角色&#xff0c;跨度比较大。如果之前没有接触过相关内容&#xff0c;学习起来还是比较费劲。 基本介绍&#xff1a; 昇思MindSpo…

ValueError和KeyError: ‘bluegrass’的问题解决

项目场景&#xff1a; 项目相关背景&#xff1a; 问题描述 遇到的问题1&#xff1a; KeyError: ‘bluegrass’ 不能识别某标签 遇到的问题2&#xff1a; xml etree.fromstring(xml_str) ValueError: Unicode strings with encoding declaration are not supported. Please …

K8S 中的 CRI、OCI、CRI shim、containerd

K8S 如何创建容器&#xff1f; 下面这张图&#xff0c;就是经典的 K8S 创建容器的步骤&#xff0c;可以说是冗长复杂&#xff0c;至于为什么设计成这样的架构&#xff0c;继续往下读。 前半部分 CRI&#xff08;Container Runtime Interface&#xff0c;容器运行时接口&#xf…

PCIe驱动开发(3)— 驱动设备文件的创建与操作

PCIe驱动开发&#xff08;3&#xff09;— 驱动设备文件的创建与操作 一、前言 在 Linux 中一切皆为文件&#xff0c;驱动加载成功以后会在“/dev”目录下生成一个相应的文件&#xff0c;应用程序通过对这个名为“/dev/xxx” (xxx 是具体的驱动文件名字)的文件进行相应的操作即…

元宇宙深入解析

元宇宙&#xff08;Metaverse&#xff09;是一个新兴的概念&#xff0c;它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿&#xff0c;提供了一个平行的数字宇宙&#xff0c;用户可以在其中实时互动&#xff0c;超越物理世界的限制。 元宇宙是什么&am…

安防视频监控/视频汇聚EasyCVR平台浏览器http可以播放,https不能播放,如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

链接追踪系列-00.es设置日志保存7天-番外篇

索引生命周期策略 ELK日志我们一般都是按天存储&#xff0c;例如索引名为"zipkin-span-2023-03-24"&#xff0c;因为日志量所占的存储是非常大的&#xff0c;我们不能一直保存&#xff0c;而是要定期清理旧的&#xff0c;这里就以保留7天日志为例。 自动清理7天以前…

Python基础语法篇(上)

Python基础语法&#xff08;上&#xff09; 一、基知二、基本数据类型&#xff08;一&#xff09;标准数据类型&#xff08;二&#xff09;数据类型转换 三、字符串基本操作&#xff08;一&#xff09;字符串的索引和切片&#xff08;二&#xff09;字符串的拼接 三、运算符四、…

【React笔记初学总结一】React新手的学习流程笔记总结,掰开了揉碎了,下载安装基础结构学习

REACT学习记录 一、React是什么&#xff1a;二、尝试安装下载&#xff1a;三、理解都有什么四、基础网页学习&#xff1a;1.几个比较重要的资源包例子2.第一个react示例&#xff1a;&#xff08;掰开了揉碎了&#xff0c;咱们先看懂它最简单的结构&#xff09;3.第二个react示例…

2.10、matlab中字符、数字、矩阵、字符串和元胞合并为字符串并将字符串以不同格式写入读出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的数据类型&#xff08;字符、数字、矩阵、字符串和元胞&#xff09;合并为字符串&#xff0c;然后将字符串以不同格式写入 Excel 文件。 以下是一个示例代码&#xff0c;展示如何将不同数据类型合并为字符串&#xff0c;并以不…

一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取 点击注册&#x1f517;开通七牛开发者帐号如果已有账号&#xff0c;直接登录七牛开发者后台&#xff0c;点击这里&#x1f517;查看 Access Key 和 Secret Key 2. Node.js获取七牛token 安装qiniu npm install qiniu创建空间 Node获取token const qi…