java实现环形链表带哨兵

双向环形链表带哨兵,这时哨兵既作为头,也作为尾。

package com.tfq.arithmetic.linkedlist;import java.util.Iterator;/*** @author: fqtang* @date: 2024/05/22/8:40* @description: 环形链表*/
public class DoublyLinkedListSentinel 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.next = next;this.value = value;}}/*** 哨兵对象*/private Node sentinel = new Node(null, -1, null);public DoublyLinkedListSentinel() {sentinel.prev = sentinel;sentinel.next = sentinel;}/*** 添加到第一个** @param value -待添加值*/public void addFirst(int value) {Node a = sentinel;Node b = sentinel.next;Node added = new Node(a, value, b);a.next = added;b.prev = added;}/*** 向索引位置插值** @param index 索引* @param value 待插入值*/public void insert(int index, int value) {Node findNode = findByIndex(index);Node last = findNode.prev;Node next = findNode;Node added = new Node(last, value, next);last.next = added;next.prev = added;}/*** 添加到最后一个** @param value -待添加值*/public void addLast(int value) {Node a = sentinel.prev;Node b = sentinel;Node added = new Node(a, value, b);a.next = added;b.prev = added;}/*** 删除第一个元素*/public void removeFirst() {Node removed = sentinel.next;if(removed == sentinel) {throw new IllegalArgumentException("不能删除哨兵节点,非法!");}Node last = sentinel;Node next = removed.next;last.next = next;next.prev = last;}/*** 删除最后一个元素*/public void removeLast() {Node removed = sentinel.prev;if(removed == sentinel) {throw new IllegalArgumentException("不能删除哨兵节点,非法!");}Node last = removed.prev;Node next = sentinel;last.next = next;next.prev = last;}/*** 根据索引删除指定元素** @param value 待删除索引*/public void removeByValue(int value) {Node remove = findByValue(value);if(remove != null) {Node last = remove.prev;Node next = remove.next;last.next = next;next.prev = last;}}public Node findByValue(int value) {/* //方法一for(Node p = sentinel.next; p != sentinel; p = p.next) {if(p.value == value) {return p;}}*///方法二Node p = sentinel.next;while(p != sentinel) {if(p.value == value) {return p;}p = p.next;}return null;}public Node findByIndex(int index) {/* //方法一int i=0;for(Node p = sentinel.next; p != sentinel; p = p.next,i++) {if(p.value == value) {return p;}}*///方法二int tIndex=index -1;if(tIndex<-1){throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}Node p = sentinel.next;int i = 0;while(p != sentinel) {if(i == tIndex) {return p;}p = p.next;i++;}return null;}/*** 根据索引删除指定元素** @param index 待删除索引*/public void remove(int index) {}@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {Node p = sentinel.next;@Overridepublic boolean hasNext() {return p != sentinel;}@Overridepublic Integer next() {int v = p.value;p = p.next;return v;}};}}

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

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

相关文章

嵌入式学习——3——IO分类模型

1、阻塞IO和非阻塞IO 1.1 阻塞IO - 在阻塞IO模型中&#xff0c;当一个IO操作&#xff08;如读取或写入&#xff09;开始时&#xff0c;如果数据没有准备好&#xff0c;程序会被挂起&#xff08;即阻塞&#xff09;&#xff0c;直到数据准备好并且IO操作完成。 - 在数据准备阶段…

浏览器API与协议

现代浏览器是一个囊括了数百个组件的操作系统&#xff0c;包括进程管理、安全沙箱、分层的优化缓存、JavaScript虚拟机、图形渲染和GPU管道、存储系统、传感器、音频和视频&#xff0c;网络机制等等。 在浏览器上运行的应用的性能。&#xff0c;取决于多个组件&#xff1a;解析…

SSH反向代理是什麼?有什麼用?

SSH反向代理&#xff0c;也被稱為SSH隧道&#xff0c;是一種利用SSH協議的端口轉發功能&#xff0c;將網路數據通過加密的SSH連接進行傳輸的技術。它的工作原理是&#xff0c;通過SSH連接將本地的一個端口與遠程伺服器的一個端口進行綁定&#xff0c;所有發往本地端口的數據都會…

notepad++ 批量转所有文件编码格式为UTF-8

1、安装notepad及PythonScript_3.0.18.0插件 建议两者都保持默认路径安装x64版本&#xff1a; 阿里云盘分享https://www.alipan.com/s/xVUDpY8v5QL安装好后如下图&#xff1a; 2、new Script&#xff0c;新建脚本&#xff0c;文件名为ConvertEncoding 3、自动打开脚本&#xff…

vue面试问题汇总

1.$nextTick 原理及作用 访问原文 Vue 的 nextTick 其本质是对 JavaScript 执行原理 EventLoop 的一种应用。nextTick 的核心是利用了如 Promise 、MutationObserver、setImmediate、setTimeout的原生 JavaScript 方法来模拟对应的微/宏任务的实现&#xff0c;本质是为了利用…

YOLOV8 如何训练自己的数据

1、git code 项目 地址 2、数据标注&#xff1a;使用yolov8官方推荐的roboflow 地址 2.1 上传数据 2.2 标注 2.3 生成数据集 2.4 导出数据 3 训练 3.1 建.yaml 文件 建立.yaml 文件 3.2 修改.yaml文件里面的内容 1.这是roboflow 网站下下来的数据&#xff0c;只需要把.…

【MySQL】第三周作业

【MySQL】第三周作业 1、在数据库example下创建college表。2、在student表上创建视图college_view。3、查看视图college_view的详细结构4、 更新视图。5 、修改视图&#xff0c;6 、删除视图college_view 1、在数据库example下创建college表。 College表内容如下所示 字段名 …

MySQL中锁的几种类型

MySQL根据加锁的范围&#xff0c;可以分为全局锁、表级锁、行级锁三类。 2.5.1. 锁定读 2.5.1.1. 共享锁和独占锁 事务的 读-读 情况并不会引起什么问题&#xff0c;对于 写-写、读-写 或 写-读 这些情况可能会引起一些问题&#xff0c;需要使用MVCC或者加锁的方式来解决。在…

【Sring】Spring整合Mybtis流程

步骤 1: 添加依赖 <!-- Spring核心依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>你的Spring版本</version> </dependency> <!-- MyBa…

15:00面试,15:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

angular插值语法与属性绑定

在 Angular 中&#xff0c;您提供的两种写法都是用来设置 HTML 元素的 title 属性&#xff0c;但它们的工作方式有所不同&#xff1a; 插值语法 (Interpolation) <h1 title"{{ name }}">我的名字</h1> 属性绑定 (Property Binding) <h1 [title]&q…

MySQL数据库下的Explain命令深度解析

Explain是一个非常有的命令&#xff0c;可以用来获取关于查询执行计划的信息&#xff0c;以及如何解释输出。Explain命令是查看查询优化器如何决定执行查询的主要方法。这个功能有一定的局限性&#xff0c;并不总是会说出真相&#xff0c;但是它的输出是可以获取的最好信息&…

Kubernetes集群上的Etcd备份和恢复

在本教程中&#xff0c;您将学习如何在Kubernetes集群上使用etcd快照进行etcd备份和恢复。 在Kubernetes架构中&#xff0c;etcd是集群的重要组成部分。所有集群对象及其状态都存储在etcd中。为了更好地理解Kubernetes&#xff0c;有几点关于etcd的信息是您需要了解的。 它是…

【探索数据结构】线性表之双链表

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

【超全干货】一文讲清什么是全民分销?怎么做好全民分销?

一、什么是全民分销&#xff1f; 全民分销&#xff0c;作为新时代营销模式的代表之一&#xff0c;是基于互联网尤其是社交媒体平台兴起的一种分销策略。它打破了传统零售与电子商务的界限&#xff0c;允许任何个人&#xff0c;无论是否为专业销售人员&#xff0c;都能成为品牌…

HTML5 新增标签的基本使用以及DOM操作

HTML5 常见标签的基本使用以及DOM操作 目录 HTML5的介绍 Web技术发展时间线什么是HTML5HTML5的应用场景HTML5新增的内容景 HTML5新增内容详解 语义化的标签H5中新增的语义标签H5中的表单多媒体应用 HTML5进行DOM操作 DOM操作 HTML5的介绍 Web技术发展时间线 1991 HTML 199…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第27课-门的打开

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第27课-门的打开 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

FreeRTOS_互斥量_学习笔记

互斥量 数值只有0或1 谁获得互斥量&#xff0c;就必须由谁释放同一个互斥量。 但其实在freeRTOS中&#xff0c;任务A获取的互斥锁&#xff0c;任务B也能释放。因此谁上锁谁开锁只是约定&#xff0c;在程序实现上不是强制的。 “可重入的函数"是指&#xff1a;多个任务同时…

Qt输入输出类使用总结

Qt输入输出类简介 QTextStream 类(文本流)和 QDataStream 类(数据流)Qt 输入输出的两个核心类,其作用分别如下: QTextStream 类:用于对数据进行文本格式的读/写操作,可在 QString、QIODevice或 QByteArray 上运行,比如把数据输出到 QString、QIODevice 或 QByteArray 对象…

Linux-文件或目录权限

在使用 ll 时&#xff0c;可以查看文件夹内容的详细信息&#xff0c;信息的第1位表示类型&#xff0c;具体信息如下&#xff1a; 类型说明-普通文件d文件夹b块设备文件c字符设备文件p管道文件s套接口文件 第2-10位表示权限&#xff0c; 举例&#xff1a;rwxr-xr-x 类型说明r…