JAVA初阶数据结构链表(2)双向链表( +专栏数据结构练习是完整版)

1.双向链表的结构(双向不带头不循环链表)

需要注意的一点就是,在jdk中的链表就是双向链表

一个节点有三个域 val(数值域) next(地址域) prev(前驱记录前一个节点的地址)

在双向链表中我们还定义了一个last用来标记最后一个节点

2.双向链表的具体实现

1.定义一个MyLinkedLIst的类(它要实现的所有内容是和单向链表中接口的方法是一样的)

双向链表的实现的方法和单项链表的方法是一样的所以接入的接口也是一样的

在写这些方法之前要先定义一个双向链表的基本框架其中构造方法是为了能够链表传入val的参数

2.1双向链表中display方法(打印链表)方法的实现 

双向链表的打印和单项链表是一样的,因为都是头节点cur从头走到尾。

2.2双向链表size方法(打印链表长度是多少)的方法的实现

也和单向链表是一样的,都是头结点从头走到尾

2.3双向链表contains(找寻专门的元素在链表中对的位置)的方法的实现

基本框架

 代码实现

 2.3双向链表addFirst方法

不进行详细讲解,绿色字看不动到专栏链表一中进行查看;

要注意的是要是只有一个节点的化就不能这样写,会发生空指针异常,所以一个的时候我们只需要让头结点指向它,然后last也指向node就行了。

2.4双向两步addlast方法(插入一个元素到节点的最后一个)

和头插法是相似的

2.5双向链表在指定位置来对要插入的数值进行插入 

和单向链表不同的是双向链表可以前进和后退 

所以我们只需要走到要插入的节点的位置,然后修改四个指向就可以了

先连后面再连前面

分两种情况如果在头部就直接插入,如果不在头部就正常进行插入,如果在尾部那么就直接尾插法,循环条件大家看一下没啥问题我相信大家的能力 

2.6删除方法remove()删除一个元素指定的

del是要删除节点的位置

其中我们要注意两种情况

要是写错的化会有空指针异常,因为headA和last存的地址的值是null所以会报错

所以我们要避免这种情况

下面是详细的图解(用删除中间节点的逻辑来对其进行删除)

(1)删除头节点的思路

       将headA往后面移动一个,然后将headA的prev位置重置为空

       也就是

      headA = headA.next;

       head.prev = null 

(2)删除中间节点的思路

(3)删除最后节点的思路

总体代码实现 

这个代码还有一个问题(隐型的问题) 如果只删除一个节点那么就会让head为null发生空指针异常,所以我们要防止这种情况

总体代码太长了不能图片

 public void remove(int key) {ListNode cur = head;while (cur != null) {if(cur.val == key) {if(cur == head) {head = head.next;if(head != null) {head.prev = null;}else {//只有一个节点 且是需要删除的节点last = null;}}else {cur.prev.next = cur.next;//删除中间节点if(cur.next != null) {cur.next.prev = cur.prev;//cur.prev.next = cur.next;}else {//删除尾巴节点//cur.prev.next = cur.next;last = last.prev;}}return;}cur = cur.next;}}

2.7删除方法removeall()删除所有这个指定元素的值

这个方法和remove方法可以说是一毛一样

在remove方法中我们不是return结束这个循环了吗,我们只要不结束这个循环让他继续走那么就可以继续进入循环进行删除

所以我们可以这样

这样就完成了

整体代码

public void removeAllKey(int key) {ListNode cur = head;while (cur != null) {if(cur.val == key) {if(cur == head) {head = head.next;if(head != null) {head.prev = null;}else {//只有一个节点 且是需要删除的节点last = null;}}else {cur.prev.next = cur.next;//删除中间节点if(cur.next != null) {cur.next.prev = cur.prev;//cur.prev.next = cur.next;}else {//删除尾巴节点//cur.prev.next = cur.next;last = last.prev;}}}cur = cur.next;}}

2.8clear方法删除所有的元素

让头结点和last节点都为空就直接清除了

后面我会在java进阶课程中详细讲解他的清空过程

进入clear的源码

其实和我写的差不多

io流那里估计是

最后希望大家看完这链表两个数据结构的文章以后就去看源码我写的和源码其实差不多,只不过源码的封装更多

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

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

相关文章

Express学习(四)

使用Express写接口 创建基本的服务器 创建API路由模块 编写GET接口 编写POST接口 CORS跨域资源共享 什么是CORS CORS由一系列HTTP响应头组成,这些HTTP响应头决定浏览器是否阻止前端JS代码跨域获取资源。浏览器的同源安全策略默认会阻止网页“跨域”获取资源。但如…

yum安装mysql 数据库tab自动补全

centos7上面没有mysql,它的数据库名字叫做mariadb [rootlocalhost ~]#yum install mariadb-server -y [rootlocalhost ~]#systemctl start mariadb.service [rootlocalhost ~]#systemctl stop firewalld [rootlocalhost ~]#setenforce 0 [rootlocalhost ~]#ss -na…

Three.js点线几何空间图形代码

Three.js点线几何空间图形代码。效果如下 下载地址 Three.js点线几何空间图形代码

docker部署springboot jar包项目

docker部署springboot jar包项目 前提,服务器环境是docker环境,如果服务器没有安装docker,可以先安装docker环境。 各个环境安装docker: Ubuntu上安装Docker: ubuntu离线安装docker: CentOS7离线安装Docker&#xff1…

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码

Python语言基础与应用-北京大学-陈斌-P40-39-基本扩展模块/上机练习:计时和文件处理-给算法计时-上机代码 上机代码: # 基本扩展模块训练 给算法计时 def factorial(number): # 自定义一个计算阶乘的函数i 1result 1 # 变量 result 用来存储每个数的阶…

【论文阅读】Natural Adversarial Examples 自然对抗的例子

文章目录 一、文章概览(一)摘要(二)导论(三)相关工作 二、IMAGENET-A 和 IMAGENET-O(一)数据集构造方式(二)数据收集过程 三、模型的故障模式四、实验&#x…

Docker自建蜜罐系统【失陷检测、外网威胁感知、威胁情报】

项目地址: https://hfish.net Hfish是一款基于Docker的网络钓鱼平台,它能够帮助安全团队模拟各种网络钓鱼攻击,以测试和提高组织的安全防御能力。 Hfish的优点 为什么选择Hfish? 蜜罐通常被定义为具有轻量级检测能力、低误报率…

Qt中QCheckBox的三种状态设置

首先启用QCheckbox的tristate属性 //启用QCheckBox的tristate属性,使checkbox有三种状态。例: questionCheckBox->setTristate(true);//使用setCheckState(Qt::CheckState state)函数设置checkbox当前的状态。例: //Qt::CheckState是枚举…

算法:数据结构顺序表表的插入、删除和查找

#include <iostream> #include <stdio.h> #define MaxSize 50 typedef int ElemType; typedef struct {ElemType data[MaxSize];int length; }SqList; bool ListInsert(SqList &L,int i,ElemType e)//插入数据 {if(i<1 || i>L.length1)//判断插入的位置是…

OPENCV(0-1之0.1)

OPENCV-0.1 学习安排计算机视觉简介是什么&#xff1f;应用领域基础概念 OpenCV简介历史背景和主要贡献者支持的语言和平台主要模块和功能 安装(windows_python)pip安装验证安装&#xff08;记得安装jupyter&#xff09; 第一个OpenCV程序实践练习 官方文档 学习安排 计算机视…

详解Postman使用

简介&#xff1a; 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求的历史记录 可以使用测试集Collections有效管理组织接口 可以在团队之间同步接口数据 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求…

Java实现自定义Hive认证账户密码

一、业务背景 在搭建好Hive环境后&#xff0c;应用项目远程连接hive需要设置用户名和密码&#xff0c;但hive默认的用户名和密码都是空&#xff0c;因此需要设置自定义用户名和密码。 二、开发步骤 2.1 新建maven项目&#xff0c;pom.xml引入相关依赖&#xff0c;主要是hadoop、…