模拟LinkedList实现的双向链表

1. 前言

前文我们用java语言实现了无哨兵的单向链表.稍作修改即可实现有哨兵的单向链表.有哨兵的单向链表相较与无哨兵的而言,其对链表的头结点的增删操作更为方便.而在此我们实现了带有头节点和尾节点的双向链表(该头节点和尾节点都不存储有效的数据).

2. 带有头节点和尾节点的双向链表

例 : 

public class BinaryLinkedList implements Iterable<Integer> {//头指针指向头节点static Node prev = new Node(null, 0, null);//尾指针指向尾节点static Node tail = new Node(null, 0, null);public BinaryLinkedList() {//将头节点的next指针指向尾节点//将尾节点的prev指针指向头节点prev.next = tail;tail.prev = prev;}private static class Node {int value;Node prev;Node next;public Node(Node prev, int value, Node next) {this.prev = prev;this.value = value;this.next = next;}}//头插法public void addHead(int value) {Node p = new Node(prev, value, prev.next);prev.next.prev = p;prev.next = p;}//从头开始遍历public void Traverse1Head() {Node p;for (p = prev.next; p != tail; p = p.next) {//空链表时, p==nullif (p == null) {return;}System.out.println("该节点的值为" + p.value);}}//从尾开始遍历public void Traverse1Tail() {Node p;for (p = tail.prev; p != prev; p = p.prev) {if (p == null) {return;}System.out.println("该节点的值为" + p.value);}}//获取指定位置的值public static int get(int index) {Node p = findIndex(index);return p.value;}//从头指针开始找指定索引的节点的值private static Node findIndex(int index) {int count = -1;Node p = prev;//这里允许index==-1的原因是此时返回的是头节点//有实际意义, 因为此时insert函数就无需对插入位置为0时做出分析if (index < -1) {throw new RuntimeException("index输入不合法");}while (count < index) {p = p.next;//此时p可能为null, 所以需要判断if (p == null) {throw new RuntimeException("输入无效的index");}count++;}//如果p是尾节点, 将抛出异常if (p == tail) {throw new RuntimeException("尾节点不可操作");}return p;}//尾插法public static void addLast(int value) {Node p = new Node(tail.prev, value, tail);tail.prev.next = p;tail.prev = p;}public void Insert(int index, int value) {//如果index==0, 则p是头节点Node p = findIndex(index - 1);Node insert = new Node(p, value, p.next);p.next.prev = insert;p.next = insert;}public int remove(int index) {//找到要删除的节点Node p = findIndex(index);int value = p.value;p.next.prev = p.prev;p.prev.next = p.next;return value;}//迭代器迭代的数据类型是整形, 又由于泛型不能是基本数据类型, 所以用到包装类@Overridepublic Iterator<Integer> iterator() {//使用到了匿名内部类return new Iterator<Integer>() {//成员变量p(实例变量)Node p = prev.next;@Overridepublic boolean hasNext() {if (p != null && p != tail) {return true;}return false;}@Overridepublic Integer next() {int value = p.value;p = p.next;return value;}};}public void Traverse2(Consumer<Integer> consumer) {Node p;for (p = prev.next; p != tail; p = p.next) {if (p == null) {return;}consumer.accept(p.value);}}
}

3. 单元测试(测试案例)

测试案例供参考 : 

@Testpublic void test1() {BinaryLinkedList b = new BinaryLinkedList();b.addHead(12);b.addHead(23);b.addHead(34);b.addHead(45);b.addHead(56);b.addHead(67);b.addHead(78);
//        b.Traverse1Head();
//        b.Traverse1Tail();
//        System.out.println(b.get(0));}@Testpublic void test2() {BinaryLinkedList b = new BinaryLinkedList();b.addLast(12);b.addLast(23);b.addLast(34);b.addLast(45);b.addLast(56);b.addLast(67);b.addLast(78);//只有实现了Intrable接口的类才能使用foreach循环,//因为foreach底层就是使用迭代器不断调用hasNext(), next()方法//迭代出值赋值给临时变量elementfor (Integer element : b) {System.out.println("该节点的数据域是" + element);}}@Testpublic void test3() {BinaryLinkedList b = new BinaryLinkedList();b.addLast(12);b.addLast(23);b.addLast(34);b.addLast(45);b.addLast(56);b.addLast(67);b.addLast(78);//使用lambda表达式b.Traverse2(value -> System.out.println("该节点的数据域的值是" + value));System.out.println("*******************");//还可以使用方法引用b.Traverse2(System.out :: println);}

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

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

相关文章

统计建模——模型——python为例

统计建模涵盖了众多数学模型和分析方法&#xff0c;这些模型和方法被广泛应用于数据分析、预测、推断、分类、聚类等任务中。下面列举了一些常见的统计建模方法及其具体应用方式&#xff1a; 目录 1.线性回归模型&#xff1a; ----python实现线性回归模型 -------使用NumPy…

计算机网络—网络层

一、网络层的功能 网络层的任务 主要任务是通过路由器实现网络互联&#xff0c;进而实现数据报在各网络之间的传输 “数据报”就是从数据链路层接收的分组好的数据&#xff0c;又叫“IP数据报”或“IP分组” 网络层提供的两种服务 1面向连接的虚电路服务 当两台计算机进行…

阿里云安装Mysql

阿里云安装Mysql 1、下载mysql包&#xff0c;并解压包2、继续解压文件3、拷贝到安装目录4、创建mysql组和用户5、创建mysql数据目录&#xff08;根目录&#xff09;6、赋予权限7、加入路径8、配置文件顺序&#xff1a;9、初始化mysql10、启动mysql&#xff08;结尾加"&…

【C++】---STL容器适配器之queue

【C】---STL容器适配器之queue 一、队列1、队列的性质 二、队列类1、队列的构造2、empty()3、push()4、pop()5、size()6、front()7、back() 三、队列的模拟实现1、头文件&#xff08;底层&#xff1a;deque&#xff09;2、测试文件3、底层&#xff1a;list 一、队列 1、队列的…

VulnHub靶机 DC-系列合计 通关攻略手册

VulnHub靶机 DC靶机系列 通关手册 DC-1&#xff1a;Vulnhub靶机 DC-1 渗透详细过程 DC-2&#xff1a;Vulnhub靶机 DC-2 渗透详细过程 DC-3&#xff1a;Vulnhub 靶机 DC-3 实战系列 渗透详细过程 DC-4&#xff1a;VulnHub系列 DC-4靶机 渗透详细过程 DC-5&#xff1a;VulnH…

Java基础_集合类_List

List Collection、List接口1、继承结构2、方法 Collection实现类1、继承结构2、相关类&#xff08;1&#xff09;AbstractCollection&#xff08;2&#xff09;AbstractListAbstractSequentialList&#xff08;子类&#xff09; 其它接口RandomAccess【java.util】Cloneable【j…

Kafka学习笔记01【2024最新版】

一、Kafka-课程介绍 官网地址&#xff1a;Apache KafkaApache Kafka: A Distributed Streaming Platform.https://kafka.apache.org/ kafka 3.6.1版本&#xff0c;作为经典分布式订阅、发布的消息传输中间件&#xff0c;kafka在实时数据处理、消息队列、流处理等领域具有广泛…

【NTN 卫星通信】NTN应该使用FDD还是TDD双工模式

1 概述 现在主流的商用地面通信系统一般都支持FDD和TDD两种模式&#xff0c;实用于不同的频段。那么卫星通信也需要有这两种模式吗&#xff1f; 2 NTN 双工模式分析 在考虑TDD模式时&#xff0c;需要设置保护时间&#xff0c;以防止终端同时发射和接收。该保护时间直接取决于终…

容器安全-镜像扫描

前言 容器镜像安全是云原生应用交付安全的重要一环&#xff0c;对上传的容器镜像进行及时安全扫描&#xff0c;并基于扫描结果选择阻断应用部署&#xff0c;可有效降低生产环境漏洞风险。容器安全面临的风险有&#xff1a;镜像风险、镜像仓库风险、编排工具风险&#xff0c;小…

【ZZULIOJ】1085: 求奇数的乘积(多实例测试)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy code 题目描述 给你n个整数&#xff0c;求他们中所有奇数的乘积 输入 输入数据包含多个测试实例&#xff0c;每个测试实例占一行&#xff0c;每行的第一个数为n&#xff0c;表示本组数据一共有n个&#xff0c;接…

计算机网络第十七天(第一天的答案)

网络互连复习笔记 1、ospf三张表&#xff1a;路由表、邻居表、链路状态数据库 2、组播地址的含义&#xff1a; 224.0.0.5所有的ospf路由器 224.0.0.6所有的ospfDR路由器 3、ospf报文类型&#xff1a; Hello(组播) 用于发现直连链路上的ospf邻居和维护ospf邻居…

Python_AI库 Matplotlib的应用简例:绘制与保存折线图

本文默认读者已具备以下技能&#xff1a; 熟悉Python基础语法&#xff0c;以自行阅读python代码块熟悉Vscode或其它编辑工具的应用 在数据可视化领域&#xff0c;Matplotlib无疑是一个强大的工具。它允许我们创建各种静态、动态、交互式的可视化图形&#xff0c;帮助我们更好…

python中如何用matplotlib写雷达图

#代码 import numpy as np # import matplotlib as plt # from matplotlib import pyplot as plt import matplotlib.pyplot as pltplt.rcParams[font.sans-serif].insert(0, SimHei) plt.rcParams[axes.unicode_minus] Falselabels np.array([速度, 力量, 经验, 防守, 发球…

JET毛选学习笔记:如何利用《矛盾论》从做实验到做科研vol. 1

一、前情回顾 上一轮讲了基于《实践论》的方法论学习一门实验&#xff0c;从获取间接经验到实践&#xff0c;总结&#xff0c;再实践&#xff0c;再总结&#xff0c;反反复复无穷尽也&#xff0c;不知道大家悟出了多少呢&#xff1f;其实&#xff0c;有一个概念我刻意避开了没…

新科技辅助器具赋能视障生活:让盲人出行融入日常

随着科技日新月异的发展&#xff0c;一款名为蝙蝠避障专为改善盲人日常生活的盲人日常生活辅助器具应运而生&#xff0c;它通过巧妙整合实时避障与拍照识别功能&#xff0c;成功改变了盲人朋友们的生活格局&#xff0c;为他们提供了更为便捷、高效的生活体验。 这款非同…

注意力机制:SENet详解

SENet&#xff08;Squeeze-and-Excitation Networks&#xff09;是2017年提出的一种经典的通道注意力机制&#xff0c;这种注意力可以让网络更加专注于一些重要的featuremap&#xff0c;它通过对特征通道间的相关性进行建模&#xff0c;把重要的特征图进行强化来提升模型的性能…

【Redis 开发】Redisson

Redisson RedissonRedisson分布式锁Redisson可重入锁Redission解决超时释放的问题Redission解决锁的判断一次性问题Redission分布式锁主从一致性问题 Redisson Redisson是一个在Redis的基础上实现的java驻内存数据网格&#xff0c;就是提供了一系列的分布式的java对象 官方地址…

分布式与一致性协议之Paxos算法(二)

Paxos算法 如何达成共识 想象这样一个场景&#xff0c;某地出现突发事件&#xff0c;当地村委会、负责人等在积极研究和搜集解决该事件的解决方案&#xff0c;你也决定参与其中&#xff0c;提交提案&#xff0c;建议一些解决方法。为了和其他村民的提案做区分&#xff0c;你的…

以太网LAN双向透明传输CH9120透传芯片实现以太网转232串口转485转TTL串口

网络串口透传芯片 CH9120 1、概述 CH9120 是一款网络串口透传芯片。CH9120 内部集成 TCP/IP 协议栈&#xff0c;可实现网络数据包和串口数据的双向透明传输&#xff0c;具有 TCP CLIENT、TCP SERVER、UDP CLIENT 、UDP SERVER 4 种工作模式&#xff0c;串口波特率最高可支持到…

BUUCTF-WEB2

[SUCTF 2019]EasySQL1 1.启动靶机 2.寻找注入点和注入方法 随便输入一个字母&#xff0c;没有回显 随便输入一个数字&#xff0c;发现有回显&#xff0c;并且回显结果一样 3.堆叠注入 1; show databases; #查看数据库 1; show tables; #查看数据表 里面有个flag 1;set …