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;地域节点选择…

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

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

基于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。 组成 选择器 用于选择页面中的…

防御安全(IPSec实验)

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

Go——数组

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

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…

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…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年&#xff0c;是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程&#xff0c;帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

H5 简单四按钮个人主页源码

源码名称&#xff1a;简单四按钮个人主页源码 源码介绍&#xff1a;一款简单的带4个按钮选项的个人主页源码&#xff0c;可自行修改内容作为自己的个人主页。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.changyouzuhao.cn/11458.html

ubuntu 23.04 安装 中文输入法

1、安装 fcitx sudo apt install fcitxfcitx 安装好后&#xff0c;可以使用 fcitx-configtool 命令进行配置&#xff0c;其界面如下所示。在这里可以配置不同输入法的切换快捷键&#xff0c;默认输入法等。刚安装系统后&#xff0c;这里只有一个输入法&#xff0c;所以接下来要…

元宇宙崛起:区块链与金融科技共绘数字新世界

文章目录 一、引言二、元宇宙与区块链的深度融合三、区块链在元宇宙金融中的应用四、金融科技在元宇宙中的创新应用五、面临的挑战与机遇《区块链与金融科技》亮点内容简介获取方式 一、引言 随着科技的飞速发展&#xff0c;元宇宙概念逐渐走进人们的视野&#xff0c;成为数字…

先进电气技术 —— 片上宽禁带器件的集成与应用

一、背景 功率转换器设计的一个关键目标是降低功率损耗以提高转换效率&#xff0c;这对可再生能源等应用产生影响。通过降低功率损耗&#xff0c;可以减小变换器元件的尺寸&#xff0c;从而使整个变换器的尺寸更小。因此&#xff0c;转换器的大小和成本完全取决于设计要求和应…

Linux:kubernetes(k8s)prestop事件的使用(11)

他的作用是在结束pod容器之后进行的操作 apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标签type: app #这个是随便写的 自定义的标签version: 1.0.0 #这个…

2024年谷歌SEO的趋势预测及应对建议(川圣SEO)#蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; 虽然说“SEO”已死这个口号已经喊了很多年了&#xff08;最终也没死&#xff09;&#xff0c;但是在2023年很…

mysql中的非空间数据导入sqlserver中空间化

以下操作都在Navicat Premium 15软件中操作 1、mysql导出数据 以导出csv为例 不修改导出路径的话默认就是在桌面 设置编码UTF-8 这边还是默认,最好不要修改,如果文本识别符号为空,导入的时候可能字段会错乱 开始即可 2、导入sqlserver数据库中

STM32---ADC

ADC 概念 众所周知&#xff0c;GPIO只能读入高电平或者低电平&#xff0c;那如果现有一个模拟量&#xff0c;该如何读取呢&#xff0c;比如电压的范围是0~3.3v&#xff0c;如何获取电压的值。就需要ADC&#xff08;Analog-Digital Converter&#xff09;了。ADC可以将引脚上连…

Linux环境下用IDEA运行Golang记录

一、背景 和存储同时开发AI项目&#xff0c;在Linux环境运行Golang项目&#xff0c;因此需要进行相关的配置。 二、Golang安装 参考&#xff1a;【Linux — 安装 Go】Linux 系统安装 Go 过程总结_linux 安装go-CSDN博客 三、IDEA中Golang配置 1、去除代理 否则在Plugins中…

4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》

4.MAC平台Python的下载、安装&#xff08;含Python2.7Python3.12双版本环境变量配置&#xff09;——《跟老吕学Python编程》&#xff09;——跟老吕学Python编程 一、下载MAC版Python1.Python官网2.MAC版Python下载网址 二、在MAC安装Python1.在MAC安装Python2.阅读Python重要…