学习双向链表带哨兵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…

高斯过程学习笔记

目录 基础知识 例子 推荐 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…

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

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

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

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

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…

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

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

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

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

NLP(17)--大模型发展(1)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型的演化&#xff1a; ElMO : 类似双向lstm 结果和词向量拼接 预训练鼻祖 GPT :使用了Transformer 模型 开始使用Token &#xff08;发现预训练的作用&#xff09; Bert&#xff1a;认为双向比单向好 MLM(双向) 优于 LT…

【Linux】POSIX线程库——线程控制

目录 1.线程创建方法 例&#xff1a;多线程创建 2.线程终止 2.1 return nulptr; 2.2 pthread_exit(nullptr); 3. 线程等待 3.1 等待原因 3.2 等待方法 线程终止的返回值问题 4.线程取消 5. 线程分离 5.1 分离原因 5.2 分离方法 6.封装线程 用的接口是POSIX线程库…

音视频开发—音频相关概念:数模转换、PCM数据与WAV文件详解

文章目录 前言1.模拟数字转换&#xff08;ADC&#xff09;1.1ADC的关键步骤&#xff1a; 2.数字模拟转换&#xff08;DAC&#xff09;2.1DAC 的基本流程包括&#xff1a; 3.PCM数据3.1PCM 数据的关键要素包括&#xff1a; 4.WAV文件4.1 WAV的构成4.2WAV文件的标准块结构4.3WAV的…

OpenLayers6入门,OpenLayers实现在地图上拖拽编辑修改绘制图形

专栏目录: OpenLayers6入门教程汇总目录 前言 在前面一章中,我们已经学会了如何绘制基础的三种图形线段、圆形和多边形:《OpenLayers6入门,OpenLayers图形绘制功能,OpenLayers实现在地图上绘制线段、圆形和多边形》,那么本章将在此基础上实现图形的拖拽编辑功能,方便我…

使用Java 读取PDF表格数据并保存到TXT或Excel

目录 导入相关Java库 Java读取PDF表格数据并保存到TXT Java读取PDF表格数据并保存到Excel 在日常工作中&#xff0c;我们经常需要处理来自各种来源的数据。其中&#xff0c;PDF 文件是常见的数据来源之一。这类文件通常包含丰富的信息&#xff0c;其中可能包含重要的表格数据…

FreeRtos进阶——栈保存现场的几种场景

MCU架构 在认识栈的结构前&#xff0c;我们先来认识以下单片机的简单架构。在我们的CPU中有着很重要的一个模块——寄存器&#xff08;R0-R15&#xff09;&#xff0c;其中R13&#xff0c;R14&#xff0c;R15的别称分别为SP栈顶指针、LR返回地址、PC当前指令地址。外部RAM是单片…

Android Gradle plugin 版本和Gradle 版本

1.当看到这两个版本时&#xff0c;确实有点迷糊。但是他们是独立的&#xff0c;没有太大关联。 就是说在Android studio中看到的两个版本信息&#xff0c;并无太大关联&#xff0c;是相互独立的。Gradle插件版本决定了你的项目是如何构建的&#xff0c;而Gradle版本是执行构建…

对竞品分析的理解

一、竞品分析是什么 竞品分析即对竞争对手进行分析&#xff0c;是市场研究中的一项重要工作&#xff0c;它可以帮助企业了解竞争对手的产品、策略、市场表现等信息&#xff0c;通过竞品分析可以为自己的产品制定更加精准的策略。 二、为什么要做竞品分析 1.了解市场情况 了解…

vue/core源码中ref源码的js化

起源&#xff1a; 当看见reactivity文件中的ref.ts文件长达五百多的ts代码后&#xff0c;突发奇想想看下转化成js有多少行。 进行转化&#xff1a; let shouldTrack true; // Define shouldTrack variable let activeEffect null; // Define activeEffect variable// 定义…

M2m中的采样

采样的完整代码 import torch import numpy as np from torchvision import datasets, transforms from torch.utils.data import DataLoader, WeightedRandomSampler, SubsetRandomSamplerdef get_oversampled_data(dataset, num_sample_per_class):""" Gener…

Upstream最新发布2024年汽车网络安全报告-百度网盘下载

Upstream最新发布2024年汽车网络安全报告-百度网盘下载 2024年2月7日&#xff0c;Upstream Security发布了2024年Upstream《GLOBAL AUTOMOTIVE CYBERSECURITY REPORT》。这份报告的第六版着重介绍了汽车网络安全的拐点&#xff1a;从实验性的黑客攻击发展到规模庞大的攻击&…