循环链表(单循环、双循环)(数据结构与算法)

news2024/11/29 8:56:39

循环链表:循环单链表、循环双链表

1. 循环单链表

在这里插入图片描述

  1. 循环单链表(Circular Singly Linked List)是一种特殊类型的单链表,其中最后一个节点的指针指向头节点,形成一个循环。

在这里插入图片描述

  1. 循环单链表与普通单链表的主要区别在于,循环单链表的尾节点的指针不是指向 nullptr,而是指向头节点,形成一个闭环。这意味着,在循环单链表中,可以通过尾节点的指针重新回到头节点。

循环单链表可以具有以下特点和优势:

  1. 尾节点的指针指向头节点,使得在遍历链表时不需要特别处理尾节点,方便实现循环遍历。
  2. 可以更容易地进行环形操作,如判断链表是否形成环、寻找环的起始点等。
  3. 循环单链表的插入和删除操作相对简单,因为不需要特别处理头部和尾部情况。
  4. 在使用循环单链表时,我们需要额外关注以下几点:
  5. 在插入和删除节点时,要确保更新指针的正确性,以避免死循环或链表中断。
  6. 在循环单链表中遍历时要设置终止条件,防止进入无限循环。

1.1 初始化一个循环单链表

typedef struct LNode   		//定义单链表结合类型
{
	ElemType data;			//每个结点存放一个一个数据元素
	struct LNode *next; 	//指针指向下一个结点
}LNode, *LinkList;

//初始化一个循环单链表
bool InitList(LinkList &L)
{
	L =(LNode *) malloc(sizeof(LNode));	 //分配一个头结点
	if(L == NULL)  		//内存不足、分配失败
		return false;
	L->next = L;		//头结点next指向头结点
	return true;
}

2.2 判断单链表是否为空

//判断循环单链表是否为空, 检查头结点指针是否指向它自己就行,如下图所示
bool Empty(LinkList L)
{
	if(L->next == L)  //检查头结点指针是否指向它自己
		return true;
	else 
		return false;
}

在这里插入图片描述


2.3 判断 p 结点是否为循环单链表的表尾结点

//判断 p 结点是否为循环单链表的表尾结点
bool isTail(LinkList L, LNode *p)
{
	if(p->next == L)
		return true;
	else
		return false;
}

在这里插入图片描述

从头结点找到尾部,时间复杂度为O(n), 从尾部找到头部,时间复杂度为O(1), 可以让L指向表尾元素(插入、删除时可能需要修改L)


2. 循环双链表

循环双链表(Circular Doubly Linked List)是一种特殊类型的双向链表,其中最后一个节点的下一个指针指向头节点,头节点的前一个指针指向最后一个节点,形成一个循环。

循环双链表与普通双链表的主要区别在于,循环双链表既具有双向链表的前驱和后继关系,也具有循环遍历的能力。

双链表:表头结点的prior指向NULL; 表尾结点的next指向NULL。

在这里插入图片描述
循环双链表:表头结点的prior指向表尾结点; 表尾结点的next指向头结点。
在这里插入图片描述

2.1循环双链表的特点和优势

  1. 可以通过任意节点的前驱和后继指针方便地在双链表中进行插入和删除操作。
  2. 最后一个节点的下一个指针指向头节点,使得在遍历链表时不需要特别处理尾节点,可以很方便地实现循环遍历。
  3. 可以更容易地进行环形操作,如判断链表是否形成环、寻找环的起始点等。
  4. 循环双链表的插入和删除操作相对简单,不需要特别处理头部和尾部情况。

在插入和删除节点时,要确保更新前驱和后继指针的正确性,以避免链表中断或形成其他错误结构。
在循环双链表中遍历时要设置终止条件,防止进入无限循环。

2.2 循环双链表的初始化

当我们在初始化一个双链表时,需要让头结点的前指针和后指针都指向头结点自己(而普通的双链表指向NULL),如下图所示:

在这里插入图片描述

//初始化空的循环双链表
bool InitDLinkList(DlinkList &L)
{
	L = (DNode*) malloc(sizeof(DNode));	//分配一个头结点
	if(L == NULL)		//内存不足,分配失败
		return false;
	L->prior = L;    //头结点的prior指向头结点
	L->next = L;   	//头结点的next指向头结点
	return true;	//初始化成功
}

2.3 判断循环链表是否为空

typedef struct DNode     //创建循环双链表
{
	ElemType data;
	struct DNode *prior,*next;
}DNode, *DLinkList;

void testDLinkList()
{
	//初始化循环双链表
	DLinkList L;
	InitDLinkList(L);
	//.......后续代码.......
}
//判断循环链表是否为空
bool Empty(DLinkList L)
{
	if(L->next == L)
		return true;
	else
		return false;
}

2.4 判断结点p是否为循环双链表的表尾结点

bool isTail(DLinkList L, DNode  *p)
{
	if(p->next == L)
		return true;
	else
		return false;
}

2.5 双链表的插入

//在p结点之后插入s结点
bool InsertNextDNode(DNode *p, DNode *s)
{
	s->next = p->next;	//将结点*s插入到结点*p之后
	p->next->prior = s;   //如果
	s->prior = p;
	p->next = s;
}

在这里插入图片描述

2.6 双链表的删除

//删除p的后继结点q
p->next = q->next;
q->next->prior = p;  //如果p没有后继结点,普通循环链表会出问题
free(q);

在这里插入图片描述

3. 知识回顾

在这里插入图片描述

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

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

相关文章

【教3妹学编程-算法题】使数组变美的最小增量运算数

2哥 : 3妹,脸上的豆豆好了没呢。 3妹:好啦,现在已经没啦 2哥 : 跟你说很快就会消下去的,还不信~ 既然你的容颜和心情都如此美丽,那我们就再做一道关于美丽的题吧。 3妹:切,2哥就会取笑我&#x…

齐纳二极管,肖特基二极管,瞬态电压抑制二极管

普通二极管,齐纳二极管,肖特基二极管的符号: 瞬态电压抑制(TVS)二极管是一种特殊的齐纳二极管,其符号如下: 普通二极管 普通二极管由n类型 的半导体和p类型的半导体结合而成。 硅材料制成的二…

【程序员日记】一行console.log引发的血案

▒ 目录 ▒ 🛫 导读需求开发环境 1️⃣ 艰难的排查过程1. 程序闪退2. 确定为内存泄漏3. 误入歧途4. 二分法注释代码5. 猿脑猜想 2️⃣ 排查procexp.exePerformance 和 Memory 3️⃣ 剔除生产环境中的console.logwebpack插件terser-webpack-plugin 🛬 文章…

Openlayers--自定义修改天地图颜色

自定义修改地图颜色 前言效果图1、给titleLayer设置className2、给class设置样式 前言 本篇文章讲解怎样调整地图颜色 效果图 调整前 调整后 1、给titleLayer设置className const arcGISLayer new TileLayer({className:blueLayer,//增加className属性source: new XYZ(…

01 向量基本概念

向量基本概念 向量是什么物理专业学生视角计算机专业学生视角数学家视角 不同视角之间的关系 这是关于3Blue1Brown "线性代数的本质"的学习笔记。 向量是什么 物理专业学生视角 向量是空间中的箭头。向量的长度和方向确定一个向量。只要长度和方向相同&#xff0c…

Tcl语言:SDC约束命令create_clock详解

相关阅读 Tcl语言https://blog.csdn.net/weixin_45791458/category_12488978.html?spm1001.2014.3001.5482 在一个设计中创建一个时钟对象的SDC命令是create_clock。该指令的BNF范式(有关BNF范式,可以参考以往文章)为: create_…

一文弄懂synchronized

简述 synchronized是什么? synchronized 关键字是一种同步锁,它可以保证在一个时刻只有一个线程可以执行某段代码。synchronized 关键字可以用在方法、代码块、静态方法和静态代码块上。 synchronized怎么用? synchronized是Java中用于实现线程同步…

最新Ai系统ChatGPT程序源码+以图生图+Dall-E2绘画+支持GPT4+Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

Spring Cloud之Seata的学习

目录 案例准备 分布式事务 基本理论 CAP定理 BASE理论 Seata 部署TC服务 数据库准备 修改Nacos配置并导入信息 启动Seata 集成Seata XA模式原理 Seata的XA实现 优点 缺点 实现 AT模式原理 AT模式的脏写问题 Seata的AT实现 XA与AT的区别 TCC模式原理 空回…

深度学习之基于Python+OpenCV+dlib的考生信息人脸识别系统(GUI界面)

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在人脸识别领域的应用已经取得了显著的进展。Python是一种常用的编程语言,它提供了许多强大的库…

Python基础入门例程37-NP37 不低于与不超过(运算符)

最近的博文: Python基础入门例程36-NP36 谁的数字大(运算符)-CSDN博客 Python基础入门例程35-NP35 朋友的年龄是否相等(运算符)-CSDN博客 Python基础入门例程34-NP34 除法与取模运算(运算符)…

SpringSecurity全家桶 (二) ——实现原理

1. SpringSecurity的强大之处 当我们并未设置登录页面时,我们只需要导入SpringSecurity的依赖就可以令我们的界面进入保护状态,由下面例子可以凸显出: 随便写个接口 RequestMapping("/hello")public String hello(){return "H…

spring-boot中实现分片上传文件

一、上传文件基本实现 1、前端效果图展示&#xff0c;这里使用element-ui plus来展示样式效果 2、基础代码如下 <template><div><el-uploadref"uploadRef"class"upload-demo":limit"1":on-change"handleExceed":auto-…

PPT制作指南

诸神缄默不语-个人CSDN博文目录 文章目录 1. SOP2. PPT的目标3. PPT素材4. 内容框架5. 设计细节本文撰写过程中使用到的参考资料 1. SOP 分析目标→收集素材→明确框架→视觉呈现 2. PPT的目标 演讲型PPT&#xff1a;字少图多 阅读型PPT&#xff1a;需要文字解释 分析维度&…

shell学习脚本05(小滴课堂)

可以对海量的数据进行提取。 -v对提取的内容进行取反。 -n显示出行号。 -w精确匹配&#xff1a; -i:忽略大小写&#xff1a; -E正则匹配&#xff1a; cut命令&#xff1a; -d指定分隔符&#xff0c;-f指定截取区域&#xff1a; 截取第一列到第三列&#xff1a; 截取第二列到最…

一文带你了解如何让自动化测试框架更自动化

一、引言 ​对于大厂的同学来说&#xff0c;接口自动化是个老生常谈的话题了&#xff0c;毕竟每年的MTSC大会议题都已经能佐证了&#xff0c;不是大数据测试&#xff0c;就是AI测试等等&#xff08;越来越高大上了&#xff09;。不可否认这些专项的方向是质量智能化发展的方向…

第五章 Python文件操作

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

SpringBoot框架使用AOP + 自定义注解实现请求日志记录

一、SpringBoot记录日志 文章目录 一、SpringBoot记录日志1.1、环境搭建1.2、配置FastJson1.3、自定义LogRecord注解1.4、定义日志实体类1.5、创建HttpRequestUtil工具类1.6、定义AOP切面1.7、编写测试类1.8、运行测试 1.1、环境搭建 搭建SpringBoot工程。引入【spring-boot-st…

Docker:Dockerfile语法

Docker&#xff1a;Dockerfile语法 1. 镜像2. 镜像结构3. Dockerfile 1. 镜像 前面我们一直在使用别人准备好的镜像&#xff0c;那如果我要部署一个Java项目&#xff0c;把它打包为一个镜像该怎么做呢&#xff1f; 2. 镜像结构 要想自己构建镜像&#xff0c;必须先了解镜像的…

【漏洞复现】IIS_7.o7.5解析漏洞

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞扫描3、漏洞验证 1.5、修复建议 1.1、漏洞描述 漏洞原理&#xff1a; cgi.fix_path1 1.png/.php该…