[Data structure]环形链表

news/2025/1/14 5:56:24/

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:数据结构。数据结构专栏主要是在讲解原理的基础上拿Java实现
⭐如果觉得文章写的不错,欢迎点个关注一键三连😉有写的不好的地方也欢迎指正,一同进步😁

循环链表

  • 1、简介
  • 2、代码实现思路总览
  • 3、Node
  • 4、CircularLinkedList
    • 4.1、添加节点
    • 4.2、删除节点
    • 4.3、显示链表内容

1、简介

循环链表是一种特殊的链表,与普通链表不同的是,在循环链表中,最后一个节点的后继指针指向第一个节点,形成一个环形结构。因此,循环链表可以无限循环下去,直到外部因素中断。
循环链表与普通链表的基本操作相同,下面是一些常见的操作:

  1. 链表的创建:与普通链表类似,在创建链表时需要创建头节点,并将其后继指针指向第一个节点。然后逐个创建后续节点,将前一个节点的后继指针指向当前节点,直到创建完整个链表。最后将最后一个节点的后继指针指向头节点,形成一个环形结构。
  2. 链表的遍历:与普通链表类似,从头节点开始,逐个遍历链表中的节点,直到回到头节点为止。
  3. 链表的插入:可以在链表的任意位置插入一个新节点。具体操作是先将新节点的后继指针指向插入位置的后继节点,然后将插入位置的后继指针指向新节点。
  4. 链表的删除:可以删除链表中的任意节点。具体操作是将待删除节点的前一个节点的后继指针指向待删除节点的下一个节点,然后释放待删除节点的内存空间。

循环链表的时间复杂度与普通链表相同,具体如下:

  1. 链表的创建时间复杂度为O(n),其中n为链表中节点的个数。
  2. 链表的遍历时间复杂度为O(n),其中n为链表中节点的个数。
  3. 链表的插入时间复杂度为O(1)。
  4. 链表的删除时间复杂度为O(1)。

需要注意的是,在操作循环链表时,需要特别处理头尾节点的关系。此外,循环链表可以无限循环下去,因此在使用循环链表时需要注意循环终止条件,以免进入无限循环。循环链表的应用场景与普通链表类似,通常用于需要无限循环遍历的场景。

2、代码实现思路总览

在这里插入图片描述

3、Node

package linkedList.circularLinkedList;/*** @author 逐梦苍穹* @date 2023/4/27 13:55*/
public class Node {private int id;private Node next;public Node(int id) {this.id = id;}@Overridepublic String toString() {return "Node{" +"id=" + id +", next=" + (next == null ? null: ("0x" + Integer.toHexString(next.hashCode()))) +'}';}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}public int getId() {return id;}public void setId(int id) {this.id = id;}
}

4、CircularLinkedList

package linkedList.circularLinkedList;/*** @author 逐梦苍穹* @date 2023/5/22 14:48*/
public class CircularLinkedList {private Node firstNode = null;public void add(Node node) {if (firstNode == null) {firstNode = node;firstNode.setNext(firstNode);} else {Node temp = firstNode;while (temp.getNext() != firstNode) {temp = temp.getNext();}temp.setNext(node);node.setNext(firstNode);}}public void delete(int id) {Node temp = this.firstNode;if (temp == null) {System.out.println("链表空无法删除");return;}while (true) {if (temp.getNext() == firstNode) break;if (temp.getNext().getId() == id) {temp.setNext(temp.getNext().getNext());System.out.println("Node{id=" + id + "}:删除成功");return;}temp = temp.getNext();}System.out.println("无此节点");}public void show(){if (firstNode == null) {System.out.println("环形链表为空无法显示");return;}// 因为firstNode不能动,因此我们仍然使用一个辅助指针完成遍历Node temp = firstNode;while (true) {System.out.println(temp);if (temp.getNext() == firstNode) {// 说明已经遍历完毕break;}temp = temp.getNext(); // temp后移}}
}

4.1、添加节点

在这里插入图片描述
在这里插入图片描述

4.2、删除节点

在这里插入图片描述

4.3、显示链表内容

在这里插入图片描述


http://www.ppmy.cn/news/88006.html

相关文章

Find My产品|苹果上架支持Find My功能的旅行保温杯

苹果美国官网近日上架了 Ember 的控温 Travel Mug 2 旅行杯,售价为 199.95 美元。该旅行杯最大的亮点就是支持“Find My”,丢失后可在 iPhone,iPad 和 Mac 上定位找回。 Travel Mug 2 旅行杯和此前推出的 Travel Mug 2 旅行杯在功能方面完全相…

微信小程序开发实战课后习题解答————第四章(作业版)

一、填空题 1、 组件 是视图层的基本组成单元。 2、 swiper内部只可以放置 swiper-item 组件。 3、 设置text文本内容长按可选的属性是 selectable 。 4、navigator组件通过设置 open-type 属性,来区分不同的跳转功能。 5、通过image的 mode …

Leetcode每日一题——“用队列实现栈”

各位CSDN的uu们你们好呀,好久没有更新本专栏啦,甚是想念!!!今天,小雅兰的学习内容是用队列实现栈,下面,让我们进入Leetcode的世界吧!!! 这是小雅兰…

Java程序设计入门教程--包

情形 在Java中,包(package)是一种松散的类的集合,它可以将各种类文件组织在一起,就像磁盘的目录(文件夹)一样。包的管理机制提供了类的多层次命名空间避免了命名冲突问题,解决了类文件的组织问题&#xff0…

【day 03】初始vue的相关指令

事件函数传参情况 1.函数不需要定义参数,作为事件函数使用时 不需要带() 2.函数定义了形参 但是没有加括号 fn形参接收到的是 事件对象 3.函数定义了形参 click“fn()” 接收到的是undefined 4.正常传参 正常接收 5.既需要传参 也需要使用 事…

算法Day14 | 理论基础,144. 二叉树的前序遍历,94.二叉树的中序遍历,145.二叉树的后序遍历

Day14 理论基础种类存储方式遍历方式定义 递归遍历144. 二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 ~~迭代遍历~~144. 二叉树的前序遍历145.二叉树的后序遍历94.二叉树的中序遍历 统一迭代94.二叉树的中序遍历144. 二叉树的前序遍历145.二叉树的后序遍历 理论基…

mysql倒库操作遇到的问题

背景:本地windows 10安装了mysql数据库后,需要把远程库的表结构和数据全部导入进来。 操作:导出数据库,导入数据库。 第一步:导出数据库 使用dump命令即可。 登陆mysql数据库 mysql -hhost --default-character-s…

CSP-202303-2-垦田计划

目录 一、题目描述 二、思路 三、C实现如下 一、题目描述 问题描述 顿顿总共选中了 n 块区域准备开垦田地,由于各块区域大小不一,开垦所需时间也不尽相同。据估算,其中第 i 块(1≤i≤n)区域的开垦耗时为 ti 天。这…