算法 数据结构 双向环形链表 手撸环形链表 环形链表实现容器 环形链表添加修改删除获取大小 环形链表实现自定义容器 手撸容器 双向环形哨兵链表 数据结构(六)

 1. 环形链表:

                 

2. 建议先不要看我写得自己先实现下,只将Node内部类复制自己命名得容器内,

    实现方法:

                     a. add方法(添加到头部,尾部添加,指定位置添加)

                     b. get方法(获取首部,获取尾部,获取指定位置)

                     c. remove方法(删除首部,删除尾部,删除指定位置)

                     d. size方法(手动维护一个size变量,实现0(1)复杂度 )

                     e. 迭代器(实现迭代器,能够循环遍历)

     手动实现之后(每个功能只实现一种也可以),再回头参照,思考下即可!  

package com.nami.algorithm.study.day05;import java.io.Serializable;
import java.util.Iterator;
import java.util.function.Consumer;/*** 环形双向哨兵链表* 非线程安全* beyond u self and trust u self.** @Author: lbc* @Date: 2023-09-01 9:07* @email: 594599620@qq.com* @Description: keep coding*/
public class RingLinkedList<E> implements Serializable, Iterable<E>, Cloneable {/*** 容器已添加的元素*/private int size = 1;/*** 哨兵节点*/private Node sentinel = new Node(null, "-1", null);/*** 初始化哨兵*/public RingLinkedList() {this.sentinel.prev = this.sentinel;this.sentinel.next = this.sentinel;}/*** 向链表添加数据** @param element 添加的元素*/public void addFirst(E element) {Node first = this.sentinel;Node next = first.next;Node node = new Node<>(first, element, next);first.next = node;next.prev = node;++this.size;}/*** 向链表尾部添加数据** @param element*/public void addLast(E element) {Node last = this.sentinel.prev;Node node = new Node<>(last, element, sentinel);last.next = node;sentinel.prev = node;++this.size;}/*** 获取容器指定位置的值** @param index* @return*/public E get(int index) {if (index > size - 1) {throw new IndexOutOfBoundsException("元素不存在");}Node next = sentinel.next;for (int i = 0; i < index; next = next.next, i++) {}if (sentinel == next) {throw new IndexOutOfBoundsException(String.format("index [%d] 不合法%n", index));}return (E) next.value;}/*** 获取指定位置节点node** @param index* @return*/private Node getNode(int index) {Node next = sentinel.next;for (int i = 0; i < index; next = next.next, i++) {}return next;}/*** 向元素指定节点添加值** @param index* @param e*/public void add(int index, E e) {if (index > size - 1) {throw new IndexOutOfBoundsException("元素不存在");}Node node = getNode(index);Node prev = node.prev;Node node1 = new Node(prev, e, node);node.prev = node1;prev.next = node1;++this.size;}/*** 移除容器内第一个元素*/public void removeFirst() {Node node = getNode(0);if (sentinel == node) {throw new IndexOutOfBoundsException(String.format("index [%d] 不合法%n", 0));}Node prev = node.prev;Node next = node.next;prev.next = next;next.prev = prev;--this.size;}/*** 删除第一个元素*/public void removeFirst0() {Node removed = this.sentinel.next;if (removed == this.sentinel) {throw new IndexOutOfBoundsException("容器内已无元素");}Node next = removed.next;this.sentinel.next = next;next.prev = this.sentinel;}/*** 移除容器内指定位置元素** @param index*/public void remove(int index) {if (index > size - 1) {throw new IndexOutOfBoundsException(String.format("index [%d] 不合法%n", index));}Node node = getNode(index);if (sentinel == node) {throw new IndexOutOfBoundsException(String.format("index [%d] 不合法%n", 0));}Node prev = node.prev;Node next = node.next;prev.next = next;next.prev = prev;--this.size;}/*** 删除最后一个节点*/public void removeLast() {Node prev = this.sentinel.prev;if (prev == this.sentinel) {return;}Node next = prev.next;Node prev0 = prev.prev;prev0.next = next;next.prev = prev0;--this.size;}/*** 获取容器大小** @return*/public int size() {return this.size - 1;}/*** 迭代器遍历** @return*/@Overridepublic Iterator iterator() {return new NodeIterator();}/*** 匿名内部类* 内部类使用到了外部类的成员变量时,不能使用static修饰*/private class NodeIterator implements Iterator {Node node = sentinel.next;@Overridepublic boolean hasNext() {return node != sentinel;}@Overridepublic Object next() {Object value = node.value;node = node.next;return value;}}/*** while实现** @param consumer*/public void forEach(Consumer consumer) {Node firstNode = this.sentinel.next;while (firstNode != sentinel) {consumer.accept(firstNode.value);firstNode = firstNode.next;}}/*** Node类型 节点对象* 二者为组合关系,所以 由外部类变为内部类,对外隐藏实现细节*/private static class Node<E> {/*** 上一个节点*/private Node<E> prev;/*** 值*/private E value;/*** 下一个节点*/private Node<E> next;public Node(Node<E> prev, E value, Node<E> next) {this.prev = prev;this.value = value;this.next = next;}}}

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

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

相关文章

HBASE知识点

HBASE是什么&#xff1f; 高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库。利用HDFS作为其文件存储系统&#xff0c;利用MapReduce来处理HBase中的海量数据。利用Zookeeper作为其分布式协同服务。用于存储非结构化和半结构化的松散数据。 HBase数据模型 RowKey: 唯…

PyTorch中,卷积层、池化层、转置卷积层输出特征图形状计算公式总结

在PyTorch中&#xff0c;卷积层&#xff08;Convolutional Layer&#xff09;、池化层&#xff08;Pooling Layer&#xff0c;例如最大池化层&#xff09;、以及转置卷积层&#xff08;Transpose Convolutional Layer&#xff0c;也称为反卷积层或上采样层&#xff09;的输出特…

ValueError: --caption_column‘ value ‘text‘ needs to be one of: image

使用diffusers在自己的数据集上进行训练报错&#xff0c;刚开始以为是自己的数据集格式不对&#xff0c;尝试了hugging face&#xff08;datasets-image_load&#xff09;中的各种数据格式都不行&#xff0c;网上搜索一圈&#xff0c;也没找到好的解决办法&#xff0c;最后死马…

Java“牵手”拼多多商品详情数据,拼多多商品详情接口,拼多多API接口申请指南

拼多多商品详情API接口的作用是获取拼多多平台上某个商品的详细信息&#xff0c;包括商品标题、价格、图片、规格、参数、店铺信息等。 开发者可以通过该接口获取到商品的原始数据&#xff0c;方便进行数据分析、价格比较、爬取等操作。通过该接口获取到的商品详情数据可以结合…

React中的页面跳转方式详解

在React中&#xff0c;页面跳转通常通过路由来实现。React有多种路由库可供选择&#xff0c;其中最常用的是React Router。React Router提供了几种不同的跳转方式&#xff0c;包括使用组件进行页面跳转、使用组件进行重定向&#xff0c;以及使用编程式导航进行跳转。 使用组件进…

flink命令行提交jar包任务

1. 环境准备 1.1 flink环境准备 关于如何安装flink&#xff0c;这个写的非常详细&#xff0c;https://blog.csdn.net/qq_43699958/article/details/132826440 在flink的bin目录启动flink cluster [rootlocalhost bin]# ./start-cluster.sh1.2 Linux环境准备 1.2.1 关闭linu…

43.MQ—RabbitMQ

目录 一、MQ—RabbitMQ。 &#xff08;1&#xff09;同步调用与异步调用。 &#xff08;1.1&#xff09;同步调用。 &#xff08;1.2&#xff09;异步调用。 &#xff08;2&#xff09;MQ之间的区别。 &#xff08;3&#xff09;RabbitMQ学习。 &#xff08;3.1&#xf…

一文读懂:苹果手机怎么录屏?

“刚买的苹果14&#xff0c;最近需要用来录屏&#xff0c;找了很久都没找到&#xff0c;朋友说苹果手机没有录屏功能&#xff0c;可是我半信半疑&#xff0c;花了这么多钱买的&#xff0c;怎么可能没有录屏功能呢&#xff0c;有人知道苹果手机怎么录屏吗&#xff1f;” 苹果手…

骨传导耳机对大脑有影响吗?骨传导耳机到底好不好

先上结论&#xff0c;骨传导耳机对大脑没有影响。骨传导耳机使用的是骨传导技术&#xff0c;声音是通过头骨骨头和颌骨给内耳传递的&#xff0c;而不是通过传统的空气传播&#xff0c;它将声音传输到颅骨&#xff0c;然后透过骨头振动直接刺激内耳&#xff0c;绕过外耳和中耳。…

C#,《小白学程序》第十五课:随机数(Random)第二,统计学初步,数据统计的计算方法与代码

1 文本格式 /// <summary> /// 《小白学程序》第十五课&#xff1a;随机数&#xff08;Random&#xff09;第二&#xff0c;统计学初步&#xff0c;数据统计的计算方法与代码 /// 用随机数做简单的统计并用图形显示统计结果。 /// </summary> /// <param name&q…

数电课程设计——课设一:加减计数器

为了帮助大家更好学习FPGA硬件语言&#xff0c;创立此资源 包含文件有&#xff1a;实验报告、仿真文件&#xff0c;资料很全&#xff0c;有问题可以私信 一、实验内容 1、利用QuartusII和Modelsim实现100进制可逆计数器编码显示实验。 二、实验步骤 &#xff08;1&#xff…

untiy horizontal 、vertical 计算角度增量

Vector3 angle this.transform.localEulerAngles; private void MovementRotation2(float horizontal, float vertical) { //Debug.Log("horizontal "horizontal" vertical "vertical" "this.transform.rotation); //直接让 Z 轴注视旋转&#…

CentOS 7 openssl 3.0.10 rpm包制作 —— 筑梦之路

源码下载地址&#xff1a; https://www.openssl.org/source/openssl-3.0.10.tar.gz 编写spec文件&#xff1a; cat << EOF > openssl.specSummary: OpenSSL 3.0.10 for CentosName: opensslVersion: %{?version}%{!?version:3.0.10}Release: 1%{?dist}Obsoletes…

企业可以自己建立大数据平台吗?有哪些好处?

随着企业的快速发展&#xff0c;企业累积了越来越多的数据&#xff0c;但管理巨量的大数据是一件非常难的事情&#xff0c;且很多数据没有充分发挥作用。因此不少企业在问&#xff0c;企业可以自己建立大数据平台吗&#xff1f;有哪些好处&#xff1f; 企业可以自己建立大数据…

大学毕业设计的益处:培养实践能力、深入专业领域、展示自信与建立联系

大学生做毕业设计有许多好处&#xff0c;以下是一些主要的原因和好处&#xff1a; 实践应用能力&#xff1a;毕业设计通常需要学生将所学的知识和技能应用到一个具体的项目中&#xff0c;这有助于他们将理论知识转化为实际应用能力。 独立思考和解决问题&#xff1a;毕业设计要…

设计模式-外观模式

文章目录 前言外观模式介绍外观模式示例 前言 当我们谈到编写博客时&#xff0c;外观模式是一个有趣而又有用的设计模式&#xff0c;它属于结构型设计模式的一种。外观模式的主要目标是简化复杂系统的接口&#xff0c;提供一个更简单的接口来访问系统的子系统。这种模式背后的…

车牌识别流程

总体流程 a) 图像预处理&#xff08;缩放。transpose等&#xff09; b) 目标检测 &#xff08;输出车牌定位、分类和关键点信息&#xff09; c) 检测后处理 &#xff08;置信度和NMS筛选&#xff09; d) 截取感兴趣区域ROI&#xff0c;利用关键点对ROI进行透视变换 e) 图像预处…

vue 验证码 图片点击

实现登陆验证 图片依次点击功能 demo &#xff0c;上图可以根据demo修改&#xff0c;直接拿用 <template><div><div class"big-box" id"BigBox" :style"background-image:url( imgCodeUrl )"><div class"click-box…

最新IDE流行度最新排名(每月更新)

2023年09月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;Top IDE索引可以帮助您决定在软件开发项目中使用哪个IDE …

Git超详细教程

文章目录 一、安装并配置Git二、Git的基本操作三、Github/GitLab/Gitee四、分支 一、安装并配置Git 查看所有的全局配置项 git config --list --global查看指定的全局配置项 git config user.name git config user.email配置用户信息 git config --global user.name "…