循环链表详解(循环单链表/循环双链表)

2023-10-30

目录

一、循环单链表

二、循环双链表


一、循环单链表

循环单链表的表尾结点的next指针总是指向头结点。 

所以在初始化循环单链表的时候,需要记得将头结点的next指针指向头结点自己:

 

判断循环单链表是否为空,只要判断头结点的next指针是否指向自己就可以了,因为循环链表的最后一个结点的next指针总是指向头结点的,如果为空,那就只能是头结点的next指针指向自己了:

判断结点是否是循环单链表的表尾结点,只需判断该结点的next指针是否指向头结点即可,因为循环链表的最后一个结点的next指针总是指向头结点的:

 

循环单链表有一些重要的性质:1、从一个结点出发,无论这个结点位于链表的哪里,都可以找到其他任何一个结点,而单链表不行。

2、在一些情况下,我们需要频繁对链表的头部和尾部进行操作,此时使用循环单链表就很有用,原因是对于单链表,已知头结点,想找到最后一个结点的话,时间复杂度是O(n);但是对于循环单链表,我们可以一开始就把头指针指向尾结点,这样找到尾结点所需时间复杂度是O(1),因为尾结点的next指针总是指向头结点,所以找到头结点的时间复杂度也是O(1)。因此,循环单链表在这种情况下的表现明显优于普通的单链表。

二、循环双链表

先拿双链表和循环双链表做个对比:

双链表:

 循环双链表:

 

在初始化循环双链表的时候,需要记得将头结点的前指针和后指针都指向头结点自己:

 像这样↓

 

根据以上性质,所以在判断循环双链表是否为空时,只需判断头指针的next指针是否指向头结点自身即可:

 

判断当前结点时都是循环双链表的表尾结点,只要判断当前节点的next指针是否指向头结点即可:

 

下面来看一下双链表和循环双链表在插入与删除上的区别:

p结点之后插入s结点,双链表的代码是这样的:

有一个明显的缺陷,即当p结点正好是尾结点的话,代码的第二句"p->next->piror=s"会出错,因为p->next指向NULL; 但是如果是循环双链表的话,上述代码就是正确的,因为循环双链表中,即使p是尾结点,它的next指针的指向也是非空的,因此就不会出错了。

同理当删除p的后继节点q,双链表的代码↓

 q结点位于尾结点位置,双链表代码就会出错,而循环链表不会。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

循环链表详解(循环单链表/循环双链表) 的相关文章

随机推荐

  • 实时渲染学习(七)全局光照:光线追踪、路径追踪与GI技术进化编年史

    参考博文 Real Time Rendering 3rd 提炼总结 八 第九章 全局光照 光线追踪 路径追踪与GI技术进化编年史 前言 本章知识概览 全局光照的基本概念 全局光照的算法主要流派 全局光照技术进化编年史 光线追踪 Ray Tr
  • SpringCloud-基础概念及整体架构

    基础概念 01 微服务架构 微服务架构师一种架构模式 它提倡将单一应用程序划分成一组小的服务 服务之间互相协调 互相配合 为用户提供最终价值 每个服务运行在其独立的进程中 服务与服务间采用轻量级的通信机制互相协作 通常是基于HTTP协议的R
  • tcpdump捕获流量,并切分多个文件保存

    tcpdump的文档地址 https www tcpdump org manpages tcpdump 1 html 中文的详细解释可以参考 https www cnblogs com wongbingming p 13212306 htm
  • Vue 使用 Export2Excel.js 导出多 sheet 的 excel

    项目需求 导出多sheet的excel表格 具体思路是 后端返回json数据 前端根据数据和具体的几项字段去导出excel表格 多sheet 多页表格到一个excel表里面 具体思路 根据Export2Excel插件 并修改插件Export
  • 【STM32外部中断使用方法】

    标题STM32外部中断使用方法 1 初始化对应引脚IO 2 初始化中断并配备优先级 void Forword Backword init void EXTI InitTypeDef EXTI InitStructure NVIC InitT
  • 腾讯云S4服务器和SN3ne性能差距大么?如何选择?

    腾讯云服务器SN3ne是标准网络优化型 S4是标准型云服务器 SN3ne实例CPU采用2 5GHz Intel Xeon Skylake 6133 处理器 S4实例CPU采用2 4GHz Intel Xeon Skylake 6148 处理
  • 在SpringBoot项目中配置Redis

    目录 一 前言 二 使用步骤 1 引入start依赖 2 在application yml配置文件中做相应配置 3 配置Redis序列化器 4 将序列化器配置到redisTemplate中 5 封装Redis操作工具类 一 前言 我们知道R
  • #ifdef与#endif的作用及用法

    一般情况下 源程序中所有的行都参加编译 但是有时希望对其中一部分内容只在满足一定条件才进行编译 也就是对一部分内容指定编译的条件 这就是 条件编译 有时 希望当满足某条件时对一组语句进行编译 而当条件不满足时则编译另一组语句 条件编译命令最
  • 论文格式中要求作者加入orcid的链接在名字后边

    论文格式中要求作者加入orcid的链接在名字后边 如下图 使用网上给的各种写法会出现以下问题 1 插入位置不合适 2 出现一个正方形的框 3 所有参考文献带框 与原本论文格式不符 摸索了一个下午 先提供正确的格式 documentclass
  • python字典多键值及重复键值的使用

    在python中使用字典 格式如下 dict key1 value1 key2 value2 在实际访问字典值时的使用格式如下 dict key 多键值 字典的多键值形式如下 dict ke11 key12 value key21 key2
  • python 统计文章单词个数

    代码 def getText txt open article txt r read txt txt lower for ch in lt gt txt txt replace ch return txt hamletTxt getText
  • Android 程序签名问题

    一 多个开发环境具有相同的 debug 签名 在多台机器用 Eclipse 开发 Android 程序的时候 签名不一致导致要反反复复删除原程序才能安装 调试很不爽吧 其实让 Eclipse 用一样的 debug 签名就好了 方法是选中其中
  • 华为OD机试 - 拼接URL(Java)

    题目描述 给定一个url前缀和url后缀 通过 分割 需要将其连接为一个完整的url 如果前缀结尾和后缀开头都没有 需要自动补上 连接符 如果前缀结尾和后缀开头都为 需要自动去重 约束 不用考虑前后缀URL不合法情况 输入描述 url前缀
  • 从零开始学习软件测试-第39天笔记

    接口测试 http消息结构 请求报文 请求行 请求方式 url 协议版本 请求头 空行 请求体 响应报文 响应行 协议版本 状态码 状态消息 响应头 空行 响应体 请求参数类型 path参数 写在路径中的 https xxx xxx com
  • 监控服务器资源定位性能瓶颈,服务端性能监控

    服务端性能监控 内容精选 换一换 JUG Java Salon 11欢迎广大 Java技术开发者或爱好者 参加 Java技术沙龙新一期来了 本次由上海 南京和广东等多地Java用户组 JUG Java User Group 联合主办 还邀请
  • shell排序 C++

    Shell排序算法严格来说基于插入排序的思想 又称为希尔排序或缩小增量排序 Shell排序算 法的排序流程如下 1 将有 n个元素的数组分成n 2 个数字序列 第 1 个数据和第n 2 1 个数据为一对 2 一次循环使每一个序列对排好顺序
  • C# 线程浅谈 (二)

    上一篇写Thread 这一篇写Task 优缺点 百度吧 反正看那个好用用那个 创建控制台程序 新建TaskDom类 还是看怎么创建 怎么使用 怎么带参 怎么返回值 这里都体现了 class TaskDom int count 0 publi
  • 并发库:同步工具类

    1 Semaphore计数信号量 Semaphore计数信号量维护了一个许可集 用于限制访问某些资源的线程数目 并提供同步机制 通俗来说 就是可以控制让多个线程拿到许可 拿到许可的线程可以并发管理同一个资源 这些拿到许可的线程可以看做一个整
  • react、umi、request设置请求头添加token

    1 在utils文件夹里的request js里添加 添加请求头 request interceptors request use url options gt 判断本地session是否有数据 如果有就得到token 并付给请求头 if
  • 循环链表详解(循环单链表/循环双链表)

    目录 一 循环单链表 二 循环双链表 一 循环单链表 循环单链表的表尾结点的next指针总是指向头结点 所以在初始化循环单链表的时候 需要记得将头结点的next指针指向头结点自己 判断循环单链表是否为空 只要判断头结点的next指针是否指向