线性表的链式存储结构————双链表(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.mzph.cn/diannao/47424.shtml

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

相关文章

Tecnomatix Plant Simulation 这本书的翻译

这本书我准备自己翻译一下&#xff0c;一是学习这个软件&#xff0c;而是提高一下英文能力。 翻译主要是利用chatgpt 书名《Tecnomatix Plant Simulation Modeling and Programming by Means of Examples》 通过示例进行建模和编程 第二版 目录 前言 1 基础知识 1.1 介绍…

【精品资料】物业行业BI大数据解决方案(43页PPT)

引言&#xff1a;物业行业BI&#xff08;Business Intelligence&#xff0c;商业智能&#xff09;大数据解决方案是专为物业管理公司设计的一套综合性数据分析与决策支持系统。该解决方案旨在通过集成、处理、分析及可视化海量数据&#xff0c;帮助物业企业提升运营效率、优化资…

U盘文件夹失踪?两大数据恢复策略全解析

在数字化信息爆炸的今天&#xff0c;U盘作为我们日常工作中不可或缺的存储工具&#xff0c;承载着大量重要数据和文件。然而&#xff0c;当您突然发现U盘中的一个重要文件夹神秘消失时&#xff0c;那份焦急与无助感油然而生。本文旨在深入探讨U盘文件夹失踪的原因&#xff0c;并…

实验七:图像的复原处理

一、实验目的 熟悉常见的噪声及其概率密度函数。熟悉在实际应用中比较重要的图像复原技术,会对退化图像进行复原处理。二、实验原理 1. 图像复原技术,说简单点,同图像增强那样,是为了以某种预定义的方式来改进图像。在具体操作过程中用流程图表示,其过程就如下面所示: 2…

ppt文本框复制到word自动缩进的问题

ppt里的字是无缩进的&#xff1a; 复制粘贴到word中&#xff0c;突然出现2字符缩进&#xff1a; 微软官方嘴硬说没问题我也是无语&#xff01;&#xff01;word保留原格式复制后&#xff0c;出现莫名其妙的缩进 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直…

CSS3实现提示工具的渐入渐出效果及CSS3动画简介

上一篇文章用CSS3实现了一个提示工具&#xff0c;本文介绍如何利用CSS3实现提示工具以渐入的方式呈现&#xff0c;以渐出的方式消失。 CSS3主要可以通过两个样式来实现动画效果&#xff1a;animation和transition。 其中&#xff0c;animation需要自己定义一组关键帧从而实现…

Ubuntu22.04安装CUDA+CUDNN+Conda+PyTorch

步骤&#xff1a; 1、安装显卡驱动&#xff1b; 2、安装CUDA&#xff1b; 3、安装CUDNN&#xff1b; 4、安装Conda&#xff1b; 5、安装Pytorch。 一、系统和硬件信息 1、Ubuntu 22.04 2、显卡&#xff1a;4060Ti 二、安装显卡驱动 &#xff08;已经安装的可以跳过&a…

mac M1 创建Mysql8.0容器

MySLQ8.0 拉取m1镜像 docker pull mysql:8.0创建挂载文件夹并且赋予权限 sudo chmod 777 /Users/zhao/software/dockerLocalData/mysql 创建容器并且挂载 docker run --name mysql_8 \-e MYSQL_ROOT_PASSWORDadmin \-v /Users/zhao/software/dockerLocalData/mysql/:/var/l…

BiLSTM 实现股票多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习&#xff1a;算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域&#xff0c;讨论了各种复杂的深度神经网络思想&#xff0c;如卷积神经网络、循环神经网络、生成对…

【MATLAB第106期】#源码分享 | 基于MATLAB的有限差分算法的全局敏感性分析模型

【MATLAB第106期】#源码分享 | 基于MATLAB的有限差分法的全局敏感性分析模型 一、原理 有限差分法是一种数值方法&#xff0c;用于估计函数对输入参数的敏感性。在全局敏感性分析中&#xff0c;这种方法特别有用&#xff0c;因为它可以评估模型输出对所有输入参数变化的整体响…

vscode+SSH连接Ubuntu

目录 问题引入 基本思路 Permission denied, please try again 修改用户名与密码 新建用户 最终成功方案 问题引入 ssh 用户名ip地址。用户名是远端服务器的用户名&#xff0c;ip地址也是远端服务器的地址。linux虚拟机的ip地址与windous主体不一样&#xff0c;所以还需要…

【BUG】已解决:AttributeError: ‘NoneType‘ object has no attribute ‘split‘

已解决&#xff1a;AttributeError: ‘NoneType‘ object has no attribute ‘split‘ 英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;…

基于Web的特产美食销售系统的设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

HardeningMeter:一款针对二进制文件和系统安全强度的开源工具

关于HardeningMeter HardeningMeter是一款针对二进制文件和系统安全强度的开源工具&#xff0c;该工具基于纯Python开发&#xff0c;经过了开发人员的精心设计&#xff0c;可以帮助广大研究人员全面评估二进制文件和系统的安全强化程度。 功能特性 其强大的功能包括全面检查各…

抖音seo短视频账号矩阵系统源码-SaaS开源部署流程开发者技术分享

抖音seo账号矩阵系统&#xff0c;短视频矩阵系统源码&#xff0c; 短视频矩阵是一种常见的视频编码标准&#xff0c;通过多账号一键授权管理的方式&#xff0c;为运营人员打造功能强大及全面的“矩阵式“管理平台。使用矩阵系统也能保证账号的稳定性&#xff0c;降低账号的风险…

客户端与服务器通讯详解(3):如何选择合适的通讯方式

上篇文章中&#xff0c;我们讲解了客户端与服务器通讯详解&#xff08;2&#xff09;&#xff1a;12种常见通讯方式&#xff0c;重点讲解了http、websocket和RESTful API三种&#xff0c;本文我们继续讲解如何依据场景选择最合适的通讯方式。欢迎友友们点赞评论。 一、客户端服…

基于 asp.net家庭财务管理系统设计与实现

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用感兴趣的可以先…

Linux 下 ElasticSearch 集群部署

目录 1. ElasticSearch下载 2. 环境准备 3. ElasticSearch部署 3.1 修改系统配置 3.2 开放端口 3.3 安装 ElasticSearch 4. 验证 本文将以三台服务器为例&#xff0c;介绍在 linux 系统下ElasticSearch的部署方式。 1. ElasticSearch下载 下载地址&#xff1a;Past Rel…

vue3+ts+vite项目中使用vite-plugin-pwa搭建 PWA 项目

参考官方github地址&#xff1a; https://github.com/vite-pwa/vite-plugin-pwa 官方文档地址&#xff1a; https://vite-pwa-org.netlify.app/guide MDN地址&#xff1a; https://developer.mozilla.org/zh-CN/docs/Web/Progressive_web_apps 前提概要 最近项目更新需求中&am…

【C++】类和对象·this指针

C中的类与C语言中的结构体有很多的相似的地方&#xff0c;可以说本质上除了结构体只能定义成员变量&#xff0c;以及结构体默认的访问控制权限是public之外与class没啥区别。但是结构体变量每次调用函数的时候需要指针&#xff0c;而类中的成员函数明明被保存在公共代码段&…