模拟LinkedList实现的双向循环链表

1. 前言

前文我们分别实现了不带哨兵的单链表,带哨兵节点的双向链表,接着我们实现带哨兵节点的双向循环链表.双向循环链表只需一个哨兵节点,该节点的prev指针和next指针都指向了自身哨兵节点.

2. 实现双向循环链表的代码

例 : 

//模拟双向循环链表
public class CircleLinkedList implements Iterable<Integer>{private static class Node{Node prev;int value;Node next;public Node(Node prev, int value, Node next) {this.prev = prev;this.value = value;this.next = next;}}private static Node head = new Node(null, 10086, null);//只有一个哨兵节点, 并且哨兵节点的两个指针域都指向本身public CircleLinkedList() {head.prev = head;head.next = head;}//头插法public void addHead(int value) {Node p = head.next;Node q = new Node(head, value, p);head.next = q;p.prev = q;}//从头开始遍历public void Traverse1Head() {Node p = head.next;while (p != head) {System.out.println("该处节点的数据域的值是" + p.value);p = p.next;}}//从尾开始遍历public void Traverse1Tail() {Node p;for (p = head.prev; p != head; p = p.prev) {System.out.println("该处节点的数据域的值是" + p.value);}}//获取指定位置的值public static int get(int index) {Node p = findIndex(index);//此时该方法返回的是哨兵节点if (p == head) {throw new RuntimeException("哨兵节点不可获取值");}return p.value;}//从哨兵节点开始找指定索引的节点的值private static Node findIndex(int index) {//我们假设哨兵节点的索引为-1int count = -1;Node p = head;if (index < -1) {throw new RuntimeException("index输入不合法");}while (count < index) {p = p.next;//当p == head, 说明遍历一圈都没找到, 即index过大if (p == head) {throw new RuntimeException("输入无效的index");}count++;}return p;}//尾插法public void addTail(int value) {Node p = head.prev;Node q = new Node(p, value, head);p.next = q;head.prev = q;}//向指定索引的位置添加节点public void Insert(int index, int value) {//找到要插入节点的前一个节点Node p = findIndex(index - 1);Node q = new Node(p, value, p.next);p.next.prev = q;p.next = q;}//对指定索引的节点进行删除操作public void remove(int index) {//找到要插入节点的前一个节点//当index==0时, p指向哨兵节点Node p = findIndex(index - 1);p.next.next.prev = p;p.next = p.next.next;}//实现了Iterable接口, 可foreach循环@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {Node p = head.next;@Overridepublic boolean hasNext() {return p != head;}@Overridepublic Integer next() {int value = p.value;p = p.next;return value;}};}
}

3. 单元测试

@Testpublic void test1() {CircleLinkedList c = new CircleLinkedList();c.addHead(12);c.addHead(23);c.addHead(34);c.addHead(45);c.addHead(56);c.addHead(67);c.addHead(78);c.Traverse1Head();
//        c.Traverse1Tail();
//        System.out.println(c.get(6));}@Testpublic void test2() {CircleLinkedList c = new CircleLinkedList();c.addTail(12);c.addTail(23);c.addTail(34);c.addTail(45);c.addTail(56);c.addTail(67);c.addTail(78);c.Insert(7, 100);c.remove(7);c.remove(0);
//        c.Traverse1Head();c.Traverse1Head();}@Testpublic void test3() {CircleLinkedList c = new CircleLinkedList();c.addTail(12);c.addTail(23);c.addTail(34);c.addTail(45);c.addTail(56);c.addTail(67);c.addTail(78);for (int element : c) {System.out.println("该节点的数据域是" + element);}}

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

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

相关文章

c++中的__declspec(dllexport) 和 __declspec(dllimport)

c中的__declspec(dllexport) 和 __declspec(dllimport) 1. __declspec(dllimport) __declspec(dllimport) 是Microsoft Visual C特有的修饰符&#xff0c;用于声明在动态链接库&#xff08;DLL&#xff09;中定义的函数和变量&#xff0c;以便在另一个模块中使用。它告诉编译…

水稻病害检测(YOLO数据集,多分类,稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫)

是自己利用LabelImg工具进行手工标注&#xff0c;数据集制作不易&#xff0c;请尊重版权&#xff08;稻瘟病、纹枯病、褐斑病、枯心病、霜霉病、水稻细菌性条纹斑病、稻苞虫&#xff09; 如果需要yolv8检测模型和数据集放在一起的压缩包&#xff0c;可以关注&#xff1a;最新最…

IO流体系

一.分类 1.字节流 &#xff08;1&#xff09;.InputStream&#xff08;字节输入流&#xff09; 定义&#xff1a;操作本地文件的字节输入流&#xff0c;可以把本地文件中的数据读取到程序中 书写步骤&#xff1a;1.创建字节输入流对象&#xff0c;2.读数据&#xff0c;3.释放…

聊聊Flink:Docker搭建Flink

一、准备工作 查看下Docker和Docker Compose版本&#xff0c;确保你安装了这些软件。 在 Flink 官网上下载 Flink 的 Docker 镜像。您可以使用以下命令从 Docker Hub 中下载&#xff1a; docker pull flink:1.18.0-scala_2.12 此命令将下载 Flink 1.18.0 版本的 Docker 镜像…

Java23种设计模式-创建型模式之单例模式

单例模式&#xff08;Singleton Pattern&#xff09;&#xff1a;通过单例模式的方法创建的类在当前进程中只有一个实例&#xff08;根据需要&#xff0c;也有可能一个线程中属于单例&#xff0c;如&#xff1a;仅线程上下文内使用同一个实例&#xff09;&#xff0c;该类负责创…

电商架构:系统设计+表设计

如有不对&#xff0c;请指正 欢迎评论区交流 需要哪些系统 商品系统、订单系统、权限系统、审核系统等。 商品系统 订单系统 审核系统 权限系统 参考 基于电商中台架构-商品系统设计(一) 附件

2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【流动式起重机司机】报名考试及流动式起重机司机复审模拟考试&#xff0c;包含流动式起重机司机报名考试答案和解析及流动式起重机司机复审模拟考试练习。安全生产模拟考试一点通结合国家流动式起重机司机考试…

电脑已经有了一个Windows10,再多装一个Windows10组成双系统

前言 前段时间已经讲过一次双Windows系统的安装教程&#xff0c;但是小白重新去看了一下&#xff0c;发现写的内容太多&#xff0c;怕小伙伴看了之后一脸萌。 所以今天咱们就重新再来讲讲&#xff1a;在同一台机器上安装Windows10双系统的教程。 注意哦&#xff01;这里的Wi…

Android优化RecyclerView图片展示:Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas,Kotlin(b)

Android优化RecyclerView图片展示&#xff1a;Glide成堆加载批量Bitmap在RecyclerView成片绘制Canvas&#xff0c;Kotlin&#xff08;b&#xff09; 对 Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView&#xff0c;Kotlin&#xff08;a&#xff09;-…

2024人工智能/机器学习/machine learning/CV/NLP重点公式汇总(算法面试考试论文)

### CV # Diffusion Model 扩散模型http://deepnlp.org/equation/diffusion-model-forward-processhttp://deepnlp.org/equation/diffusion-model-forward-process-reparameterizationhttp://deepnlp.org/equation/diffusion-model-reverse-processhttp://deepnlp.org/equation…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…

求解约瑟夫问题

思路&#xff1a; 我们要创建两个指针 有一个指针pcur指向头结点&#xff0c;该pcur作为报数的指针&#xff0c;还有一个指针ptail指向尾结点&#xff0c;作为记录pcur的地址 每报数为m时&#xff0c;pcur指向下一个元素的地址&#xff0c;ptail销毁报数为m的地址&#xff0…

制糖工业智能工厂数字孪生可视化平台,推进制糖产业数字化转型

制糖工业智能工厂数字孪生可视化平台&#xff0c;推进制糖产业数字化转型。随着信息技术的快速发展&#xff0c;数字化转型已成为各行各业的重要趋势。在糖果加工制造领域&#xff0c;智能工厂数字孪生可视化平台的出现&#xff0c;为行业数字化转型注入了新的活力。 糖果加工制…

Java创建对象的最佳方式:单例模式(Singleton)

前言 单例模式是java中最简单的设计模式之一&#xff0c;属于创建式模式&#xff0c;提供了一种创建对象的最佳方式。 具体而言&#xff0c;单例模式涉及到一个具体的类&#xff0c;这个类可以确保只有单个对象被创建。它包含一个访问其唯一对象的方法&#xff0c;供外部直接…

算法训练营day25

零、回溯算法理论 参考链接13.1 回溯算法 - Hello 算法 (hello-algo.com) 1.尝试与回退 之所以称之为回溯算法&#xff0c;是因为该算法在搜索解空间时会采用“尝试”与“回退”的策略。当算法在搜索过程中遇到某个状态无法继续前进或无法得到满足条件的解时&#xff0c;它会…

python应用-socket网络编程(1)

目录 1 先简单回顾下客户端和服务端通信的知识 2 服务端常用函数 3 客户端常用函数 4 服务端和客户端都用的函数 5 示例介绍客户端和服务端通信过程 6 建立服务端套接制 7 创建服务端函数socket.create_server() 8 创建客户端套接字 9 客户端连接函数socket.create_co…

【.net core】【sqlsugar】条件查询时使用Contains的注意问题

在使用sqlsugar条件查询时&#xff0c;条件中如果使用Contains&#xff0c;如果需要自定义条件&#xff0c;需保证类型一致 目标需求&#xff1a;生成 WHERE ([1],[2],[3] like concat(%, concat( concat( [, CAST(orderState AS CHAR)) , ]) ,%)) 为条件的查询语句 //…

在docker中安装paddle serving @FreeBSD(待续)

因为FreeBSD本身不能装paddle serving&#xff0c;所以我们要在docker里面装。 Paddle Serving官网&#xff1a;GitHub - PaddlePaddle/Serving: A flexible, high-performance carrier for machine learning models&#xff08;『飞桨』服务化部署框架&#xff09; wheel包下…

JS-事件和日期对象

1.事件流&#xff1a; 1.事件捕获&#xff08;同类型事件时&#xff09;&#xff1a;从外层到内层&#xff1b;从最顶级的父元素一级一级往下找子元素触发同名事件&#xff0c;直到触发事件的元素为止 事件捕获&#xff0c;只能通过addEventListener并且参数写true才是事件捕获…

基于Springboot的甘肃旅游服务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的甘肃旅游服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…