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.mzph.cn/news/743781.shtml

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

相关文章

力扣思路题:重复的子字符串

注意比较j与j-i是否相同 bool repeatedSubstringPattern(char* s) {int i;int nstrlen(s);bool flag;for(int i1;i<n/2;i){if(n%i0){flagtrue;}for(int ji;j<n;j){if(s[j]!s[j-i]){flagfalse;break;}}if(flagtrue){return true;}}return false; }

腾讯云服务器地域有啥区别?选哪个比较好?

腾讯云服务器地域怎么选择&#xff1f;不同地域之间有什么区别&#xff1f;腾讯云哪个地域好&#xff1f;地域选择遵循就近原则&#xff0c;访客距离地域越近网络延迟越低&#xff0c;速度越快。腾讯云百科txybk.com告诉大家关于地域的选择还有很多因素&#xff0c;地域节点选择…

Python中的区块链技术与应用

区块链技术是一个复杂的概念&#xff0c;涉及许多不同的方面&#xff0c;如加密算法、数据结构、网络协议等。在这里&#xff0c;我将提供一个简单的区块链实现示例&#xff0c;以帮助你理解其基本概念。请注意&#xff0c;这个示例是为了教学目的而简化的&#xff0c;并不适用…

Shell脚本启动程序失败

单独执行.sh文件正常&#xff0c;在crontab定时任务中配置执行失败 #!/bin/bash# 定时任务执行失败添加以下俩行 source /etc/profile source ~/.bash_profile# 替换为实际脚本逻辑... echo "abc"

新版minio依赖对putObject进行了修改

老版的 PutObjectArgs putObjectArgsnew PutObjectArgs(bucketName, file.getOriginalFilename(), file.getInputStream(), null, null, file.getContentType()); 新版的 minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(file.getOriginalFilenam…

sql server 恢复数据库、恢复单表数据的方法

如果不小心把某个表的数据删了&#xff0c;可以用之前的备份文件对单表进行数据恢复。 1、新建一个数据库&#xff08;全新的数据库&#xff09;&#xff0c;记得路径&#xff0c;恢复的时候要用到&#xff0c;新建完不要对数据库做什么操作。 2、用需要恢复表的数据库的备份文…

数据对比与处理利器——Pandas 实战

Pandas作为数据处理利器&#xff0c;在数据对比与处理方面发挥着重要作用。下面我们将通过实战案例来展示Pandas的强大功能。 一、数据导入与清洗 首先&#xff0c;我们需要从数据源导入数据&#xff0c;并进行必要的清洗。Pandas支持多种数据格式&#xff0c;如CSV、Excel、…

SpringBoot项目串口通讯之jSerialComm

目录 1.pom坐标2.控制层3.接口4.实现类-通过串口向设备发数据5.监听设备通过串口返回数据6.创建响应结果类ResponseResult 1.pom坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xml…

【青书学堂】2024年第一学期 程序设计基础(高起专) 作业

【青书学堂】2024年第一学期 程序设计基础(高起专) 作业 为了方便日后复习&#xff0c;青书学堂成人大专试题整理。 若有未整理的课程&#xff0c;请私信我补充&#xff0c;欢迎爱学习的同学们收藏点赞关注&#xff01;文章内容仅限学习使用&#xff01;&#xff01;&#xff0…

基于FPGA的OV7725摄像头的HDMI显示(含源码)

1、概述 本文FPGA通过SCCB接口初始化OV7725摄像头寄存器&#xff0c;然后采集OV7725的摄像头数据&#xff0c;使用DDR3对数据进行暂存&#xff0c;最后将数据输出到HDMI显示器上进行显示。 该工程对应系统框图如下所示&#xff0c;主要包含OV7725驱动及数据处理模块、DDR3读写控…

CSS概念及入门

CSS概念及入门 简介 CSS 的全称为&#xff1a;层叠样式表 ( Cascading Style Sheets ) 。 CSS 也是一种标记语言&#xff0c;用于给 HTML 结构设置样式&#xff0c;例如&#xff1a;文字大小、颜色、元素宽高等等。 主流的布局方式:divcss。 组成 选择器 用于选择页面中的…

springboot混用RedisTemplate(lettuce、jedis)和Redisson客户端

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/136679352 redis常用的三大客户端&#xff1a;lettuce、jedis、redisson 一般都是 lettuce redisson&#xff08;推荐&#xff0…

防御安全(IPSec实验)

目录 需求&#xff1a; pc1 ping通 pc2 ,使用IPSec VPN 拓扑图&#xff1a; ​编辑实验配置&#xff1a; 注意&#xff1a; 直接在路由器r1和r2分别配置即可&#xff0c;路由器r1和r2要写一条缺省指向ISP 实验配置截图如下&#xff1a; 2. r1​编辑 3. r3​编辑 3.r…

工业互联网的安全策略及发展趋势——青创智通

工业物联网解决方案-工业IOT-青创智通 随着科技的不断发展&#xff0c;工业互联网作为工业与互联网的结合体&#xff0c;正日益成为推动工业转型升级的重要力量。然而&#xff0c;伴随着工业互联网的广泛应用&#xff0c;其安全问题也日益凸显。本文将从工业互联网的安全性角度…

Node.js_会话控制

介绍 HTTP是一种无状态的协议,没有办法区分多次的请求是否来自同一客户端,无法区分用户身份,需要通过会话控制来解决该问题 会话控制技术 cookie: 按照域名分别保存,默认在关闭浏览器的时候数据消失,可以通过第三个参数设置有效期。运行流程:浏览器向服务器发送请求时…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义&#xff1a;var a[len] int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且类型的组成部分。一旦定义&#xff0c;长度不能变。长度是数组类…

认识Testbench仿真激励

一、认识Testbench Bench有平台之意&#xff0c;所以Testbench就是测试平台的意思。 任何一个被测模块&#xff0c;都有输入和输出&#xff0c;此模块是否合格的判断依据&#xff0c;就是在满足输入要求的情况下&#xff0c;能否得到符合预期的输出。我们把被测模块称作UUT&…

docker镜像ssh服务

基于commit命令实现 首先我们是基于Ubuntu:18.04版本做ssh服务&#xff0c;拉取镜像 [rootmaster ~]# docker pull ubuntu:18.04 [rootmaster ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 f9a80a5…

Kafka问题纪要

1. 取 如何获取 topic 主题的列表 bin/kafka-topics.sh --list --zookeeper localhost:2181 2. 生产者和消费者的命令行是什么&#xff1f; 生产者在主题上发布消息&#xff1a; bin/kafka-console-producer.sh --broker-list 192.168.43.49:9092 --topicHello-Kafka 注意这…

vue3 el-form中嵌套el-tabale 对输入动态校验

简单案例 <el-form :model"Form" :rules"rules" ref"FormRef" class"formDiv"><el-table :data"Form.copyWriters" style"width: 100%"><el-table-column label"文案链接"><temp…