数据结构学习笔记——链式表示中的双链表及循环单/双链表

news/2024/12/22 23:16:35/

一、双链表

(一)双链表的定义

双链表是在单链表结点上增添了一个指针域prior,指针域prior指向当前结点的前驱结点,即此时链表的每个结点中都有两个指针域prior和next,从而可以很容易通过后继结点找到前驱结点,故访问前驱和后继结点的时间复杂度都为O(1)
在这里插入图片描述

(二)双链表的判空

一个带头结点L的双链表,若L->next==NULL时,则该双链表为空;一个不带头结点的双链表,若L==NULL时,则该双链表为空。

双链表判空条件
带头结点L->next==NULL
不带头结点L==NULL

(三)双链表的插入操作

  • 由于双链表可以很快地找到前驱结点,所以双链表的插入、删除操作的时间复杂度都为O(1)

双链表的插入操作可以概括为【先连后,后连前】,若在指针 *p 指向的结点之后插入结点 *q,首先,新结点q与原本 *p的指针域相连,即下一个结点,然后将结点q插入到结点p之后,再将其prior和next域相连,代码如下:

q->next=p->next;
p->next->prior=q;
q->prior=p;
p->next=q;

在这里插入图片描述

这里的代码插入不唯一,插入操作必须保证的是不能断链,即不能导致*p的后继结点的指针丢掉。

(四)双链表的删除操作

双链表的删除操作的代码如下:

p->next=q->next;
q->next->prior=p;
free(q);

在这里插入图片描述

二、循环单链表

(一)循环单链表的定义

循环单链表可以实现从任一个结点访问链表中的任何结点(遍历整个链表。
在这里插入图片描述

(二)循环单链表的判空

在带头结点L的循环单链表中,若L==head->next时,循环单链表为空;在不带头结点的循环单链表中,若L==NULL时,循环单链表为空。

循环单链表判空条件
带头结点L==head->next
不带头结点L==NULL

(三)循环单链表的查找

在一个带头结点的循环单链表中:
1、若只设置头指针L,则查找表头结点的时间复杂度为O(1),查找表尾结点需要依次遍历整个链表,即时间复杂度为O(n),而查找一个结点的前驱结点时的时间复杂度为O(n)。
2、若只设置尾指针R,这样的好处是可以使查找链表的开始结点和终端结点很方便,其查找时间都为O(1),而查找一个结点的前驱结点时的时间复杂度为O(n)。

(四)循环单链表的插入操作

循环单链表的插入操作与单链表类似,也是【先连后,再连前】,若在指针 *p 指向的结点后插入结点 *p ,步骤是:首先将q的指针域与p结点原本的指向下一个结点的指针域相连,即q->next=p->next,然后再将q结点与p结点相连,即p->next=q,如下:

q->next=p->next;	//先连后
p->next=q;		//再连前

在这里插入图片描述

(五)循环单链表的删除操作

循环单链表的删除操作也与单链表类似,删除的步骤可概括为【先定位,后断开释放】,将*q指针指向要删除的结点,p为其前驱结点,如下代码:

q=p->next;	//先定位,定位删除位置
p->next=q->next;	//断开q与p的连接,p与下一个结点连接
free(q);	//free()函数释放结点

在这里插入图片描述

三、循环双链表

(一)循环双链表的定义

循环双链表基于双链表,头结点L的prior域指向表尾结点,查找表头结点和表尾结点的时间复杂度均为O(1),查找一个结点的前驱结点时的时间复杂度也为O(1)。
在这里插入图片描述

(二)循环双链表的判空

一个带头结点L的循环双链表,若L->prior==L&&L->next==L时,则该双链表为空。(头结点的prior和next域都指向其本身时为空)

循环双链表判空条件
带头结点L->prior == L && L->next == L
不带头结点L==NULL

(三)循环双链表的插入操作

若要在指针 *p 指向的结点后插入结点 *p,其代码如下:

q->next=p->next;
p->next->prior=q;
q->prior=p;
p->next=q;

在这里插入图片描述

(四)循环双链表的删除操作

将*p指针指向要删除的结点,其代码如下:

p->next->prior=p->prior;
p->prior->next=p->next;
free(p);

在这里插入图片描述


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

相关文章

python脚本监听域名证书过期时间,并将通知消息到钉钉

版本一: 执行脚本带上 --dingtalk-webhook和–domains后指定钉钉token和域名 python3 ssl_spirtime.py --dingtalk-webhook https://oapi.dingtalk.com/robot/send?access_tokenavd345324 --domains www.abc1.com www.abc2.com www.abc3.com脚本如下 #!/usr/bin…

第三届字节跳动奖学金官宣开奖,13位优秀科研学子每人获10万奖学金

最近,第三届字节跳动奖学金正式公布了获奖者名单。 经过字节跳动技术专家团队层层评审,本届字节跳动奖学金共有来自北京大学、复旦大学、清华大学、上海交通大学、香港科技大学、浙江大学、中国科学技术大学(按拼音首字母排序)的 …

UG NX机械设计软件常见安装问题

UG软件版本这里咱们就不提了,大部分伙伴应该都是钩子激活软件,肯定会遇到或多或少的安装问题,今天这里给大家总结了下,需要的小伙伴自取。 有其他问题可以一起讨论,也希望看到的小伙伴多关注支持哦。 安装UGNX的必要…

TypeScript之高级类型

一、是什么 除了string、number、boolean 这种基础类型外,在 typescript 类型声明中还存在一些高级的类型应用 这些高级类型,是typescript为了保证语言的灵活性,所使用的一些语言特性。这些特性有助于我们应对复杂多变的开发场景 二、有哪…

Python的web自动化学习(三)Selenium的显性、隐形等待

引言: WebDriver的显性等待和隐形等待是用于在测试过程中等待元素加载或操作完成的两种等待方式。了解此两种方式是为后面自动化找到适合的方法去运用 显性等待(Explicit Wait) 显性等待是通过使用WebDriverWait类和ExpectedConditions类来…

JavaEE就业课 V12.5 完整版

简介 众所周知,在IT互联网领域是靠技术吃饭的,更符合企业需求的先进技术才是硬通货。黑马Java学科一直在行动,一直走在行业最前沿! 四项目制用四个不同类型、不同开发深度的项目,去解决企业用人需求与学员具备相应开发能力匹配的…

Android NDK开发详解之调试和性能分析的系统跟踪概览

Android NDK开发详解之调试和性能分析的系统跟踪概览 系统跟踪指南 “系统跟踪”就是记录短时间内的设备活动。系统跟踪会生成跟踪文件,该文件可用于生成系统报告。此报告有助于您了解如何最有效地提升应用或游戏的性能。 有关进行跟踪和性能分析的全面介绍&#x…

【数据结构】树形结构所有路径复原为链表

目录 1. 树形结构可视化 2. 树形结构转为链表 此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径&…