Java(二十)---双向链表

news/2024/9/14 1:32:26/ 标签: java, 链表, 开发语言

文章目录

  • 前言
  • 1.为什么学习双向链表
  • 2.双向链表(LinkedList)的模拟实现
    • 2.1. 准备工作
    • 2.2.功能的实现
      • 2.2.1.显示链表(display) 和 是否包含某种元素(contains) 以及 获取链表节点个数(size())
      • 2.2.2.头插法(addFirst),尾插法(addLast),以及在指定位置进行插入(addIndex)
      • 2.2.3.删除第一次出现key的节点(remove)、删除所有值为val的结点(removeAllkey)。
      • 2.2.4.清除链表(clear)
  • 3.LinkedList的使用
    • 3.1.LinkedList的构造方法
    • 3.2.LinkedList的其他常用方法介绍


前言

上一篇我们进行链表的编程题的练习,今天我们来学习双向循环不带头节点的链表的相关操作,并且把链表结个尾,为下面学习栈和队列打下基础。


1.为什么学习双向链表

我们在上一篇学习了单链表,我们在进行在指定位置插入数据和在指定位置删除数据的时候,通常需要两个节点,一个在前面,一个在后面,如果我们在节点处,再加上一个前一个节点的引用,那么这个问题就迎刃而解了,因此我们引入双向链表


2.双向链表(LinkedList)的模拟实现

2.1. 准备工作

java">public class MyLinkedList {static class ListNode{public int val;public ListNode prev;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode head;public ListNode last;//头插法public void addFirst(int data){ }//尾插法public void addLast(int data){}//任意位置插入,第一个数据节点为0号下标public void addIndex(int index,int data){}//查找是否包含关键字key是否在单链表当中public boolean contains(int key){return false;}//删除第一次出现关键字为key的节点public void remove(int key){}//删除所有值为key的节点public void removeAllKey(int key){}//得到单链表的长度public int size(){return 0;}public void display(){}public void clear(){}
}

2.2.功能的实现

2.2.1.显示链表(display) 和 是否包含某种元素(contains) 以及 获取链表节点个数(size())

上面三种方法,有着异曲同工之妙,有很多相似之处,所以一起来说一下。
显示链表

创建一个节点(cur) 使得cur = head,循环遍历,直到 cur == null,停止循环,再循环中打印val,即可。

java">    public void display(){ListNode cur = head;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}

是否包含某种元素
创建一个节点(cur) 使得cur = head,循环遍历,直到 cur == null,停止循环,再循环中判断cur.val是否等于cur,即可。

java">public boolean contains(int key){ListNode cur = head;while (cur != null) {if (cur.val == key){return true;}cur = cur.next;}return false;}

** 获得节点数目**

创建一个节点(cur) 使得cur = head,循环遍历,直到 cur == null,停止循环,再循环中size++,即可。

java">public int size(){ListNode cur = head;int size = 0;while (cur != null) {size++;cur = cur.next;}return size;}

2.2.2.头插法(addFirst),尾插法(addLast),以及在指定位置进行插入(addIndex)

在进行插入的时候,一定要注意头结点和尾节点为null的时候,让新节点就等于头节点和尾节点。
头插法
在这里插入图片描述
首先要判断头节点和尾节点是否为空,如果为空的话,就要新节点(node) = 头节点 = 尾节点。
其次,如果不为空,说明链表中有节点,那么,就把head的指向和node的指向改变,然后在把head = node

java">    public void addFirst(int data){ListNode node = new ListNode(data);if (head == null && last == null){head = last = node;}else{node.next = head;head.prev = node;head = node;}}

尾插法
在这里插入图片描述
首先要判断头节点和尾节点是否为空,如果为空的话,就要新节点(node) = 头节点 = 尾节点。
其次,如果不为空,说明链表中有节点,那么,就把last的指向和node的指向改变,然后在把last= node

java"> //尾插法public void addLast(int data){ListNode node = new ListNode(data);if (head == null && last == null){head = last = node;}else{last.next = node;node.prev = last;last = node;}}

在指定位置进行插入
首先要判断index位置的合法性,如果index< 0 或者是 index > size(),那么就是不合法的,可以直接返回,也可以报异常。
如果 index == 0 ,应用头插法,如果 index == size(),应用尾插法。
如果是在 0<index<size(),那么就要使用新的方法了。
在这里插入图片描述

java">public void addIndex(int index,int data){int len = size();if (index < 0 || index > len){System.out.println("index位置不合法");return;}if (index == 0){addFirst(data);}if (index == len) {addLast(data);}ListNode node = new ListNode(data);ListNode cur = head;while (index != 0){cur = cur.next;index--;}node.next = cur;cur.prev.next = node;node.prev = cur.prev;cur.prev = node;}

2.2.3.删除第一次出现key的节点(remove)、删除所有值为val的结点(removeAllkey)。

删除第一次出现key的节点
在这里插入图片描述

java">    public void remove(int key){ListNode cur = head;while (cur != null){if (cur.val == key){break;}cur = cur.next;}if (cur == head){head = head.next;head.prev = null;return;}if (cur == last){last = last.prev;last.next = null;return;}cur.prev.next = cur.next;cur.next.prev = cur.prev;}

或者

java">public void remove1(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 {cur.prev.next = cur.next;if (cur.next == null){last = last.prev;}else {cur.next.prev = cur.prev;}return;}}cur = cur.next;}}

删除所有值为val的节点
只需要将上面第二段代码中return删去即可。

java">public void remove1(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 {cur.prev.next = cur.next;if (cur.next == null){last = last.prev;}else {cur.next.prev = cur.prev;}return;}}cur = cur.next;}}

2.2.4.清除链表(clear)

java">public void clear(){ListNode cur = head;while(cur != null){ListNode curN = cur.next;cur.next = null;cur.prev = null;cur = curN;}head = last = null;}

3.LinkedList的使用

3.1.LinkedList的构造方法

LinkedList() 无参构造方法
public LinkedList(Collection<? extends E> c) 使用其他集合容器中元素构造List的构造方法

java">    public static void main(String[] args) {LinkedList<Integer>list = new LinkedList<>();list.addFirst(2);list.addLast(3);list.add(1,4);System.out.println(list);LinkedList<Integer>list1 = new LinkedList<>(list);list1.add(100);System.out.println(list1);list1.addAll(list);System.out.println(list1);}

3.2.LinkedList的其他常用方法介绍

在这里插入图片描述
上述的功能,大家自己去尝试写一下吧。


http://www.ppmy.cn/news/1475903.html

相关文章

RK3568 V1.4.0 SDK,USB OTG端子不能被电脑识别出adb设备,解决

修改后的/usr/bin/usbdevice: #!/bin/sh # # Usage: # usbdevice [start|update|stop] # # Hookable stages: # usb_<pre|post>_<init|prepare|start|stop|restart>_hook # <usb function>_<pre|post>_<prepare|start|stop>_hook # # Example …

第三方配件也能适配苹果了,iOS 18与iPadOS 18将支持快速配对

苹果公司以其对用户体验的不懈追求和对创新技术的不断探索而闻名。随着iOS 18和iPadOS 18的发布&#xff0c;苹果再次证明了其在移动操作系统领域的领先地位。 最新系统版本中的一项引人注目的功能&#xff0c;便是对蓝牙和Wi-Fi配件的配对方式进行了重大改进&#xff0c;不仅…

【LabVIEW学习篇 - 6】:数组、簇

文章目录 数组创建数组数组函数数组大小 根据索引取值数组与for循环 案例一案例二 簇LabVIEW簇的特点和用途&#xff1a;创建簇解除捆绑按名称解除捆绑簇的捆绑重新排序簇中控件 数组 在LabVIEW中&#xff0c;数组是一种用于存储相同数据类型的多个元素的数据结构。以下是关于…

技术探索之kotlin浅谈

Kotlin是一种静态类型编程语言&#xff0c;它运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;可以与Java代码互操作。Kotlin由JetBrains开发&#xff0c;是一种现代、简洁且安全的编程语言。它在2011年首次亮相&#xff0c;2017年被谷歌宣布为Android官方开发语言。…

作业7.16

第一题&#xff1a; 在终端的界面上输出:__-__-__-__ 1秒过后&#xff0c; 变成 1_-__-__-__ 再1秒过后&#xff0c;变成 12-__-__-__ 依此类推 经过8秒&#xff0c;最终变成 12-34-56-78 \b 是printf里面&#xff0c;光标向左移动的转义符 #include <stdio.h> #include …

视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机,包括T80004系列高清HDMI编码器、4K超高清HDMI编码器

视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机&#xff0c;包括T80004系列高清HDMI编码器、4K超高清HDMI编码器。 视频使用操作说明书-T80004系列视频编码器如何对接海康NVR硬盘录像机(不带屏)&#xff0c;包括T80004系列高清HDMI编码器、4K超高清HDMI编码…

hid.dll丢失怎么办?hid.dll丢失解决步骤分享

hid.dll&#xff0c;即Human Interface Device Dynamic Link Library&#xff0c;是Windows操作系统中用于管理人机交互设备&#xff08;HID&#xff09;的核心组件。这些设备包括但不限于键盘、鼠标、游戏控制器等。该DLL文件确保这些设备能够与操作系统顺畅通信&#xff0c;实…

ECCV`24 | 编辑能力无上限!北航谷歌旷视等开源Chat-Edit-3D: 3D 场景编辑新范式!

文章链接&#xff1a;https://arxiv.org/abs/2407.06842 项目地址&#xff1a;https://sk-fun.fun/CE3D/ 代码&#xff1a;https://github.com/Fangkang515/CE3D/tree/main 引言 过去的3D场景编辑方法往往局限于固定的文本输入模式和有限的编辑能力。用户需要学习特定的命令或…

前端打包部署后源码安全问题总结

随着现代Web应用越来越依赖于客户端技术&#xff0c;前端安全问题也随之突显。源码泄露是一个严重的安全问题&#xff0c;它不仅暴露了应用的内部逻辑和业务关键信息&#xff0c;还可能导致更广泛的安全风险。本文将详细介绍源码泄露的潜在风险&#xff0c;并提供一系列策略和工…

C语言经典程序100案例

C语言经典程序100题(完整版) 【程序1】题目&#xff1a;有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数都是多少 程序分析&#xff1a;可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去掉不满足条件的排列。 #include "stdio…

linux 安装 RocketMQ 4.7

安装介绍 Centos 7RocketMQ 4.7JDK 1.8 (安装JDK参考)RocketMQ的官网地址&#xff1a; http://rocketmq.apache.orgGithub地址是 https://github.com/apach e/rocketmq 安装操作 下载RocketMQ RocketMQ运行版本下载地址&#xff1a; Rocketmq-all-4.7.1-bin-release.zip …

【前端】零基础学会编写CSS

一、什么是CSS CSS (Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种是一种用来为结构化文档&#xff08;如 HTML 文档&#xff09;添加样式&#xff08;字体、间距和颜色等&#xff09;的计算机语言&#xff0c;能够对网页中元素位置的排版进行像素级别的精…

【概率论三】参数估计

文章目录 一. 点估计1. 矩估计法2. 极大似然法1. 似然函数2. 极大似然估计 3. 评价估计量的标准2.1. 无偏性2.2. 有效性2.3. 一致性 三. 区间估计1. 区间估计的概念2. 正态总体参数的区间估计 参数估计讲什么 由样本来确定未知参数参数估计分为点估计与区间估计 一. 点估计 所…

ATC 2024 | 快手开源大模型长序列训练加速技术,性能大幅超越 SOTA 方案

导读 在深度学习领域&#xff0c;训练大型语言模型&#xff08;LLMs&#xff09;一直是一项极具挑战性的任务&#xff0c;它不仅需要巨大的计算资源&#xff0c;同时对内存的消耗也非常巨大。近期&#xff0c;快手大模型团队提出了创新的方法&#xff0c;包括感知流水并行的激…

数模打怪(五)之相关系数

一、什么是相关系数 相关系数&#xff1a;用来衡量两个变量之间的相关性的大小。 根据数据满足的不同条件&#xff0c;选择不同的相关系数进行计算和分析。 两种最为常用的相关系数&#xff1a;person相关系数和spearman等相关系数。 二、Person相关系数 1、什么是Person相…

哈希表(知识点+leetcode)以及字符串哈希

文章目录 一、什么是哈希表二、哈希表常见结构介绍leetcode经典例题242 有效的字母异位词思路编程 349 两个数组的交集思路编程 1 两数之和思路编程 454 四数相加II思路编程 字符串哈希前言思路编程 一、什么是哈希表 哈希表是散列表&#xff0c;就是通过关键码值而直接进行访…

16_Shell好用工具:sed

16_Shell好用工具&#xff1a;sed 零、语法解析 sed [选项参数] [模式匹配/sed命令] 文件 命令说明aadd&#xff0c;新增iinsert&#xff0c;新增cchange&#xff0c;修改ssubstitute&#xff0c;替换ddelete&#xff0c;删除pprint, 打印 通常与 -n 连用 一、增&#xff08;…

五、 计算机网络(考点篇)

1 网络概述和模型 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。计算机网络的功能&#xff1a;数据通信、资源共享、管理集中化、实现分布式处理、负载均衡。 网络性能指标&#xff1a;速率、带宽(频带宽度或传送线路…

Lua协程(同步的多线程)

1.coroutine.create( func ) 创建一个协程&#xff0c;返回co&#xff08;coroutine&#xff09;&#xff0c;参数是一个函数&#xff0c;当调用resume时就唤醒co并调用函数 2.coroutine.resume(co, 函数参数们) 启动协程co并传入协程调用函数的参数&#xff0c;可以带回协程…

PHP恋爱话术微信小程序系统源码

&#x1f496;恋爱高手的秘密武器&#xff01;恋爱话术微信小程序&#xff0c;让情话信手拈来✨ &#x1f4ad;【开场白&#xff1a;恋爱路上的甜蜜助手】&#x1f4ad; 还在为跟心仪的TA聊天时找不到话题而尴尬&#xff1f;或是担心自己说的每句话都显得那么“直男/女”&…