学习双向链表带哨兵demo

定义

在计算机科学中,链表是数据元素的线性集合,其每个元素都指向下一个元素,元素存储上并不连续。

双向链表,每个元素知道其上一个元素和下一个元素。

以下为示例代码:

package com.tfq.arithmetic.linkedlist;import java.util.Iterator;
import java.util.function.Consumer;/*** @author: fqtang* @date: 2024/05/21/9:29* @description: 双向链表(带哨兵)*/
public class DoubleLinkedListSentinel implements Iterable<Integer> {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 head;//头哨兵private Node tail;//尾哨兵public DoubleLinkedListSentinel() {this.head = new Node(null, 666, null);this.tail = new Node(null, 999, null);head.next = tail;tail.prev = head;}/*** 返回链表第一种方式** @return*/public void loop(Consumer<Integer> consumer) {Node p = head.next;while(p != null) {consumer.accept(p.value);p = p.next;}}/*** 返回链表第二种方式** @return*/public void loop2(Consumer<Integer> consumer) {for(Node p = head.next; p != null; p = p.next) {consumer.accept(p.value);}}public void addFirst(int value) {insert(0, value);}public void addLast(int value) {Node last = tail.prev;Node insertNode = new Node(last, value, tail);last.next = insertNode;tail.prev = insertNode;}private Node findLast() {return tail.prev;}public void removeLast() {Node remove = tail.prev;if(remove == head) {throw new IllegalArgumentException(String.format("双向链表为空,不能删除此链表的头部!"));}Node prev = remove.prev;prev.next = tail;tail.prev = prev;}/*** 根据索引查找链表的节点** @param index* @return*/private Node findNode(int index) {int i = -1;for(Node p = head; p != tail; p = p.next, i++) {if(i == index) {return p;}}return null;//没找到}public int getValue(int index) {Node node = findNode(index - 1);if(node == head || node == tail) {throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}return findNode(index - 1).value;}/*** 向索引位置插值** @param index 索引* @param value 待插入值*/public void insert(int index, int value) {//找到上一个节点和下一个节点Node prev = findNode(index - 1);if(prev == null) {throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}Node next = prev.next;//创建一个要插入的新节点Node insertedNode = new Node(prev, value, next);prev.next = insertedNode;next.prev = insertedNode;}/*** 删除第一个节点*/public void removeFirst() {remove(0);}/*** 根据索引删除指定元素** @param index 待删除索引*/public void remove(int index) {Node prev = findNode(index - 1);if(prev == null) {throw new IllegalArgumentException(String.format("index [%d] 不合法%n", index));}Node removed = prev.next;if(removed == tail) {throw new IllegalArgumentException(String.format("index [%d] 不合法,已删除尾部 %n", index));}Node next = removed.next;prev.next = next;next.prev = prev;}/*** 返回链表第三种方式** @return*/@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {Node p = head.next;@Overridepublic boolean hasNext() {return p != tail;}@Overridepublic Integer next() {int v = p.value;p = p.next;return v;}};}
}

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

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

相关文章

Flask 蓝图路由的模块化开发

基于 Flask 蓝图路由的模块化开发 1. 编程目标 为了提高Flask应用的可维护性和可扩展性&#xff0c;我们通过使用Flask的蓝图(Blueprint)功能&#xff0c;可以将不同的功能模块拆分到独立的文件中&#xff0c;方便后续的开发和维护。 2. 项目结构 项目结构树如下&#xff1…

C++设计模式之单例模式、模板模式、状态模式、原型模式、CRTP 模式、组件模式、观察者模式、发布-订阅模式、访问者模式

文章目录 参考 参考 游戏开发中经常用到的设计模式【C】游戏开发常用的设计模式&#xff0c;高手都这样写&#xff1f;单例模式、组件模式、原型模式、访问者模式等

假如Redis⾥里里⾯面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

使⽤用 keys 指令可以扫出指定模式的 key 列列表。但是要注意 keys 指令会导致线程阻塞⼀一段时间&#xff0c;线上服务会停 顿&#xff0c;直到指令执⾏行行完毕&#xff0c;服务才能恢复。这个时候可以使⽤用 scan 指令&#xff0c; scan 指令可以⽆无阻塞的提取出指定模式 的…

高斯过程学习笔记

目录 基础知识 例子 推荐 A Visual Exploration of Gaussian Processes (distill.pub) AB - Introduction to Gaussian Processes - Part I (bridg.land) 基础知识 高斯过程回归&#xff08;Gaussian Process Regression&#xff09; - 知乎 (zhihu.com) 高斯过程&#x…

破译智能密码:大模型进阶之路

人工智能浪潮席卷全球&#xff0c;大模型&#xff08;Large Language Models&#xff09;作为其核心技术之一&#xff0c;正以惊人的速度改变着我们的世界。从创作诗歌、编写代码到提供医疗咨询&#xff0c;大模型在各行各业中展现出令人瞩目的能力。然而&#xff0c;要让这些“…

马斯克xAI公司获60亿美元融资,超级计算工厂将于2025年秋季前问世

马斯克旗下的xAI公司宣布了一项令人瞩目的计划——建造一个名为“超级计算工厂”的巨型超级计算机。这一前所未有的项目不仅体现了马斯克对于人工智能&#xff08;AI&#xff09;技术的深刻洞察&#xff0c;也彰显了他在技术创新上的坚定决心。 据悉&#xff0c;超级计算工厂将…

085.蛋糕案例:滚雪球式营销让蛋糕店的客户疯涨

085.蛋糕案例&#xff1a;滚雪球式营销让蛋糕店的客户疯涨 时间: 2024-5-27 分类: 营销流量 作者: admin 0 次浏览 085.蛋糕案例&#xff1a;滚雪球式营销让蛋糕店的客户疯涨 在美国的爱德华州&#xff0c;有一家叫FlyingPie 的比萨小店。店主人有一家网站&#xff0c;做得很乱…

7个靠谱的副业赚钱方法,个个都可以月入过万!宝妈,上班族,学生党都可以做的兼职副业

你是不是也有过这样的困扰&#xff0c;生活费不够用&#xff0c;想要找个兼职贴补家用或者满足自己的小欲望&#xff1f;今天&#xff0c;我就带你一起走进这个五彩斑斓的兼职世界&#xff0c;让你轻松实现月入过千的小目标&#xff01; 在我多年的兼职探险历程中&#xff0c;我…

15.2js数组练习题答案

&#xff08;1&#xff09;求出数组中的最大值 var arr[1,8,45,23,14,5]// 直接输出// console.log(Math.max(...arr))// 封装函数function fn(argArr){return Math.max(...argArr)}var res1fn(arr)console.log(res1) //45//复用函数var res2fn([65,32,656,87,56,48])con…

local dimming(局部调光)介绍

文章目录 1. 什么是local dimming2. 工作原理3. 类型4. 优点5. 缺点和局限7. 技术发展趋势 1. 什么是local dimming local dimming&#xff08;局部调光&#xff09;是电视和显示器中用于提升画面对比度和画质的背光技术。其基本原理是将背光源&#xff08;通常是LED&#xff…

C++ ─── string的模拟实现

本博客将简单实现来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数。 下期我们继续讲解完整版string的模拟实现&#xff08;将不再会是浅拷贝了&#xff09; 说明&#xff1a;下述string类没有显式定义其拷贝构造函数与赋值运…

Java应用中文件上传安全性分析与安全实践

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 一. 文件上传的风险 二. 使用合适的框架和库 1. Spr…

java项目技术方案——书写示例

在编写一个Java项目的技术方案时&#xff0c;我们需要考虑多个方面&#xff0c;包括项目架构、技术栈、开发工具、数据持久化、安全性、代码结构等。以下是一个基于Spring Boot框架的Java Web项目的技术方案示例&#xff0c;包括代码示例。 1. 项目概述 本Java项目是一个基于…

从华为云Redis到AWS ElastiCache的操作方法

越来越多企业选择出海&#xff0c;那么就涉及到IT系统的迁移&#xff0c;本文将详细介绍如何将华为云Redis顺利迁移到AWS ElastiCache的操作方法&#xff0c;九河云将为您介绍迁移步骤以帮助您顺利完成这一重要任务。 **1. 确定迁移计划** 在开始迁移之前&#xff0c;首先要制…

slam的应用场景与落地步骤

常用的slam有2d 3d&#xff0c;激光和视觉slam。本文简要介绍一下slam的应用场景&#xff0c;和落地方案。 常用的2d框架有&#xff0c;gmapping ,cartographer, hector, 3d激光有loam aloam lio-sam, fast-lio fastlio2, 视觉有orbslam2/3, vio等 常用的slam传感器有&#xff…

Maven重新加载jar包

环境&#xff1a;Windows maven版本&#xff1a;3.9.6 1.下载maven Index of /dist/maven/maven-3/3.9.6/source 2.配置maven环境变量 例如&#xff1a; MAVEN_HOME:D:\tools\apache-maven-3.9.6(maven的本地地址) 在Path目录后添加;%MAVEN_HOME%\bin; 3.打开cmd&#xf…

【线性代数】【一】1. 线性方程组与线性组合

文章目录 前言一、线性方程组的求解1.1 直线的交点1.2 向量的加权求和 二、线性组合的表示范围三、线性方程组的解的分析总结 前言 有段时间没更新了&#xff0c;准备开个新坑&#xff0c;写点数学基础相关的内容&#xff0c;计划先过一遍线性代数&#xff0c;再扩展到矩阵论&…

什么是http状态码?常见的有哪些?它们所代表什么含义?

HTTP状态码是由HTTP协议定义的一组三位数字&#xff0c;用于表示服务器对请求的处理结果的状态。 常见的HTTP状态码及其含义如下&#xff1a; - 1xx&#xff1a;信息性状态码&#xff0c;表示请求已被接收&#xff0c;继续处理。 - 100&#xff1a;Continue&#xff08;继…

【机器学习01】基本概念

机器学习是计算机科学的一个分支&#xff0c;通过算法和统计模型使计算机系统能够在没有明确指令的情况下执行特定任务。机器学习的核心思想是从数据中学习规律&#xff0c;并基于这些规律进行预测或决策。以下是机器学习的一些基本数学定义和概念&#xff1a; 1. 数据集 (Dat…

科普:水冷负载的工作原理

水冷负载是一种利用水作为冷却介质&#xff0c;将电子设备产生的热量传递到外部环境的散热方式。它广泛应用于各种电子设备&#xff0c;如服务器、数据中心、电力设备等&#xff0c;以提高设备的运行效率和稳定性。本文将对水冷负载的工作原理进行简要科普。 水冷负载的工作原理…