【数据结构_6】双向链表的实现

一、实现MyDLinkedList(双向链表)

package LinkedList;public class MyDLinkedList {//首先我们要创建节点(因为双向链表和单向链表的节点不一样!!)static class Node{public String val;public Node prev = null;public Node next = null;//给一个构造方法public Node(String val) {this.val = val;}}//表示整个链表,此处不引入傀儡节点,使用Null表示空的链表public Node head = null;//为了方便后续的尾插曹祖public Node tail = null;//给一个toStirng的打印@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("[");//进行链表的遍历for(Node cur = head;cur!= null ;cur = cur.next){stringBuilder.append(cur.val);if(cur.next != null) {stringBuilder.append(",");}}stringBuilder.append("]");return stringBuilder.toString();}//接下来来实现一些双向链表的核心操作//1.实现头插操作public void addFirst(String val){Node newNode = new Node(val);//首先判断链表是否为空的情况if(head == null){head = newNode;tail = newNode;}else {//再来看看一般情况newNode.next = head;head. prev = newNode;//2.让head指向新节点head = newNode;}}//2.实现链表的尾插操作public void addLast(String val){Node newNode = new Node(val);//1.首先判断链表为空的情况,可知与头插操作一样if(head == null){head = newNode;tail = newNode;}else {//2.考虑一般情况tail.next = newNode;newNode.prev = tail;tail = newNode;}}//实现链表长度的计算public int size(){int size =0;for(Node cur = head;cur != null;cur = cur.next){size++;}return size;}//3.实现双向链表的按位置插入public void add(int index,String val){int size = size();//1.首先判断index的值是否合法if( index < 0 || index > size ){throw  new IndexOutOfBoundsException("Index:"+index+",Size:"+size);}//2.判断特殊位置if(index ==0 ){//此时就是头插操作addFirst(val);return;}if(index== size){//此时就是尾插addLast(val);return;}//3.进行一般的插入//先找到要插入节点的前一个节点Node prev = head;for(int i =0;i<index-1;i++){prev = prev.next;}//此时我们已经找到了要插入节点的前一个节点Node newNode = new Node(val);Node next = prev.next;//首先建立新节点与上一个节点之间的关系prev.next = newNode;newNode.prev = prev;//再建立新节点与下一个节点之间的关系newNode.next = next;next.prev = newNode;}//4.实现包含查找操作public Boolean contains(String val){for (Node cur = head ; cur != null;cur = cur.next){if(cur.val.equals(val)) {return true;}}return false;}//5.查找元素,返回该元素的下标,如果没有找到,返回-1public int indexOf(String val){int index =0;for (Node cur = head;cur != null;cur =cur.next){if(cur.val.equals(val)){return  index;}index++;}return -1;}//6.头删public void removeFirst(){//1.首先考虑是否为空链表if(head == null){return;//空链表无法进行删除操作}//2.考虑只有一个节点的情况if(head.next == null){head = null;tail = null;return;}//3.考虑一般情况head = head.next;head.prev = null;}//7.尾部删除public void removeLast(){//1.考虑空链表if (head == null){return;}//2.考虑只有一个节点if(head.next == null){head = null;tail = null;return;}//3.考虑一般情况tail = tail.prev;tail.next = null;}//8.指定位置删除public void remove(int index){int size = size();//对index做判断if(index <0 || index >= size){throw  new IndexOutOfBoundsException("index:"+index+",size:"+size);}//2.如果是删除index=0if(index ==0){removeFirst();return;}if(index ==size-1){removeLast();return;}//3.考虑一般情况的删除//先找到前一个节点Node prev = head;for(int i =0;i<index-1;index++){prev = prev.next;}Node toRemove = prev.next;Node next = toRemove.next;//4.进行删除操作prev.next = next;next.prev =prev;}//9.指定值删除public void remove(String val){//1.首先考虑空的链表if(head == null){return ;}//2.判定头删/尾删操作if(val.equals(head.val)){removeFirst();return;}if(val.equals(tail.val)){removeLast();return;}//3.一般情况 先找到前一个节点Node toRemove = head;for (;toRemove!=null;toRemove= toRemove.next){if(toRemove.val.equals(val)){break;}}//循环之外有两种情况一种是找到了打破循环 另一种是循环走完了!if(toRemove == null){return ;}Node prev = toRemove.prev;Node next = toRemove.next;prev.next = next;next.prev = prev;}//10.链表的清空操作public void clear(){head = null;tail = null;}public static void test(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("b");list.addFirst("c");System.out.println(list);}public static  void test1(){MyDLinkedList list = new MyDLinkedList();list.addLast("c");list.addLast("b");list.addLast("a");System.out.println(list);}public static void test3(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0,"b");list.add(2,"c");System.out.println(list);}public static void test4(){MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0,"b");list.add(2,"c");System.out.println(list);System.out.println(list.indexOf("a"));System.out.println(list.contains("b"));System.out.println(list.contains("d"));}public static void test5() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.removeFirst();list.removeFirst();System.out.println(list);}public static void test6() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.removeLast();list.removeLast();System.out.println(list);}public static void test7() {MyDLinkedList list = new MyDLinkedList();list.addFirst("a");list.addFirst("a");list.addFirst("a");list.addFirst("a");list.add(0, "b");list.add(2, "c");System.out.println(list);list.remove(1);list.remove(4);System.out.println(list);}public static void test8() {MyDLinkedList list = new MyDLinkedList();list.addLast("a");list.addLast("b");list.addLast("c");System.out.println(list);list.remove("a");System.out.println(list);}public static void main(String[] args) {//  test();// test1();//test3();// test4();//test5();//test6();//test7();//test8();}
}

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

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

相关文章

做Data+AI的长期主义者,加速全球化战略布局

在Data与AI深度融合的新纪元&#xff0c;唯有秉持长期主义方能真正释放数智化的深层价值。2025年是人工智能从技术爆发转向规模化落地的关键节点&#xff0c;也是标志着袋鼠云即将迎来十周年的重要里程碑。2025年4月16日&#xff0c;袋鼠云成功举办了“做DataAI的长期主义者——…

构建基于PHP和MySQL的解梦系统:设计与实现

引言 梦境解析一直是人类心理学和文化研究的重要领域。随着互联网技术的发展,构建一个在线的解梦系统能够帮助更多人理解自己梦境的含义。本文将详细介绍如何使用PHP和MySQL构建一个功能完整的解梦系统,包括系统架构设计、数据库模型、核心功能实现以及优化策略。 本文源码下…

【桌面】【系统应用】Samba共享文件夹

目录 场景一&#xff1a;银河麒麟桌面与银河麒麟桌面之间共享文件夹 环境准备 实现目标 操作步骤 &#xff08;一&#xff09;配置主机A共享文件夹 1、环境准备 2、在主机A创建共享文件夹 3、设置共享文件密码 &#xff08;二&#xff09;主机B访问主机A 场景二&…

OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个可分离的线性滤波器到一个矩阵&#xff08;图像&#xff09;。 该函数对矩阵应用一个可分离的线性滤波器。也就是说&#xff0c;首先&a…

webpack理解与使用

一、背景 webpack的最初目标是实现前端工程的模块化&#xff0c;旨在更高效的管理和维护项目中的每一个资源。 最早的时候&#xff0c;我们通过文件划分的方式实现模块化&#xff0c;也就是将每个功能及其相关状态数据都放在一个JS文件中&#xff0c;约定每个文件就是一个独立…

rac环境下,增加一个控制文件controlfile

先关闭节点二&#xff0c;在节点一上操作 1、查看控制文件个数和路径 SQL> show parameter control 2、备份参数文件 SQL> create pfile/home/oracle/orcl.pfile20250417 from spfile; 3、修改控制文件参数 SQL> alter system set contr…

git安装(windows)

通过网盘分享的文件&#xff1a;资料(1) 链接: https://pan.baidu.com/s/1MAenYzcQ436MlKbIYQidoQ 提取码: evu6 点击next 可修改安装路径 默认就行 一般从命令行调用&#xff0c;所以不用创建。 用vscode&#xff0c;所以这么选择。

Spring Boot整合难点?AI一键生成全流程解决方案

在当今的软件开发领域&#xff0c;Spring Boot 凭借其简化开发流程、快速搭建项目的优势&#xff0c;成为了众多开发者的首选框架。然而&#xff0c;Spring Boot 的整合过程并非一帆风顺&#xff0c;常常会遇到各种难点。而飞算 JavaAI 的出现&#xff0c;为解决这些问题提供了…

Python批量处理PDF图片详解(插入、压缩、提取、替换、分页、旋转、删除)

目录 一、概述 二、 使用工具 三、Python 在 PDF 中插入图片 3.1 插入图片到现有PDF 3.2 插入图片到新建PDF 3.3 批量插入多张图片到PDF 四、Python 提取 PDF 图片及其元数据 五、Python 替换 PDF 图片 5.1 使用图片替换图片 5.2 使用文字替换图片 六、Python 实现 …

山东大学软件学院创新项目实训开发日志(15)之中医知识问答历史对话查看bug处理后端信息响应成功但前端未获取到

在开发中医知识问答历史对话查看功能的时候&#xff0c;出现了前后端信息获取异同的问题&#xff0c;在经过非常非常非常艰难的查询之后终于解决了这一问题&#xff0c;而这一问题的罪魁祸首就是后端没有setter和getter方法&#xff01;&#xff01;&#xff01;&#xff01;&a…

Arkts应用全局UI状态存储和持久化V2(AppStorageV2、PersistenceV2和@Type)

目录 应用全局UI状态存储和持久化V2版本 AppStorageV2 connect remove keys 示例 使用限制 PersistenceV2 connect remove keys save notifyOnError 示例 使用限制 Type 使用限制 应用全局UI状态存储和持久化V2版本 以下实例AppStorageV2、PersistenceV2和装饰…

最大子序和问题——动态规划/贪心算法解决

目录 一&#xff1a;问题描述 二&#xff1a;解决思路1——动态规划思想 三&#xff1a;C 语言代码实现 四&#xff1a;复杂度分析 五&#xff1a;解决思路2——贪心算法思想 六&#xff1a;具体步骤 七: C语言代码实现 八&#xff1a;复杂度分析 一&#xff1a;问题描述 …

【Python入门】文件读取全攻略:5种常用格式(csv/excel/word/ppt/pdf)一键搞定 | 附完整代码示例

大家好&#xff0c;我是唐叔&#xff01;今天给大家带来一篇Python文件读取的终极指南。无论是数据分析、办公自动化还是爬虫开发&#xff0c;文件读取都是Python程序员必须掌握的核心技能。本文将详细介绍Python处理5大常用文件格式的方法&#xff0c;包含完整可运行的代码示例…

四、小白如何用Pygame制作一款跑酷类游戏(页面暂停和主角跑步动作的实现)

四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主角跑步动作的实现&#xff09; 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 四、小白如何用Pygame制作一款跑酷类游戏&#xff08;页面暂停和主…

《基于 RNN 的股票预测模型代码优化:从重塑到直接可视化》

在深度学习领域&#xff0c;使用循环神经网络&#xff08;RNN&#xff09;进行股票价格预测是一个常见且具有挑战性的任务。本文将围绕一段基于 RNN 的股票预测代码的改动前后差别展开&#xff0c;深入剖析代码的优化思路和效果。 原始代码思路与问题 原始代码实现了一个完整…

Lambda 函数与 peek 操作的使用案例

Lambda 函数和 peek 操作是 Java 8 Stream API 中非常有用的特性&#xff0c;下面我将介绍它们的使用案例。 Lambda 函数使用案例 Lambda 表达式是 Java 8 引入的一种简洁的匿名函数表示方式。 集合操作 List<String> names Arrays.asList("Alice", "B…

Docker私有仓库页面访问实现

通过 docker run -d -p 5000:5000 --name registry registry:2 命令搭建的Docker私有仓库默认不提供网页访问界面。它是一个基于API的后端服务&#xff0c;主要用于镜像的存储和管理。但可以通过以下两种方式实现网页访问&#xff1a; 一、通过第三方Web UI工具扩展 1. 使用 D…

[王阳明代数讲义]语言模型核心代码调研

语言模型核心代码调研 基于Consciciteation‌的才气张量持续思考综述将文本生成建模为才气张量网络扩散过程&#xff0c;实现非自回归推理通过才气张量的群-拓扑流形交叉注意力实现多模态推理&#xff0c;将输入压缩到低维空间持续迭代提出「条件计算提前终止」机制&#xff0c…

flink jobmanager离奇的heap oom

文章目录 现象描述开始分析1.初步分析dump文件2.AI分析引用关系分析方向2.1 flink BlobServer bug分析方向2.2 和运行环境有关分析方向2.3 和任务有关 回到问题本身&#xff0c;思考一下1. seatunnel到底有没有问题2.再次分析zipfile对象3.分析seatunnel es connector 源码4 怀…

APP动态交互原型实例|墨刀变量控制+条件判断教程

引言 不同行业的产品经理在绘制原型图时&#xff0c;拥有不同的呈现方式。对于第三方软件技术服务公司的产品经理来说&#xff0c;高保真动态交互原型不仅可以在开发前验证交互逻辑&#xff0c;还能为甲方客户带来更直观、真实的体验。 本文第三部分将分享一个实战案例&#…