数据结构与算法-循环链表、双向链表
我们这里接着上一篇单链表继续往下深入学习循环链表、双向链表。
链表
- 🎈3.循环链表
- 🔭3.1循环链表的概念
- 🔭3.2循环链表的基本操作
- 🔎3.2.1创建空表
- 🔎3.2.2插入操作
- 🔎3.2.3删除操作
- 🎈4.双向链表
- 🔭4.1类型定义
- 🔭4.2头插法创建双向链表
- 🔭4.3尾插法创建双向链表
- 🔭4.4插入操作
- 🔭4.5删除操作
🎈3.循环链表
🔭3.1循环链表的概念
循环链表是一种头尾相接的链表。它的特点是由链表的尾结点的指针域不为空,而是指向头结点,整个链表形成一个环。由此,从表中任何一个结点出发均可找到链表的其他结点。在单链表中,将终端结点的指针域NULL改为指向表头结点的或开始结点,就得到了单链形式的循环链表,并简称为单循环链表。与单链表一样,为了使空表和非空表处理一致,循环链表也可以设置一个头结点。空循环链表和非空循环链表如图所示:
🏆单循环链表的基本算法与非循环单链表的算法基本相同,只需对表尾的判断条件做出修改即可,例如,判断表尾结点的条件为:
p->next==head.
🔭3.2循环链表的基本操作

🔎对于上述这个非空单循环链表:
✅当我们用头指针表示单循环链表:找a1的时间复杂度为:O(1),找an的时间复杂度为:O(n).
✅当我们用尾指针表示单循环链表:找a1的时间复杂度为:O(1)(R->next->next),找an的时间复杂度为:O(1)(R).
🏆因此,我们通常采用尾指针的单循环链表。
🔎3.2.1创建空表
void InitList(LNode *&rear)
{rear = new LNode;//创建头结点rear->next = rear;
}
🔎3.2.2插入操作
void InsertList(LNode *&rear, ElemType e)
{//在表尾插入一个结点LNode* s = new LNode;s->data = e;s->next = rear->next;rear->next = s;rear = s;
}
🔎3.2.3删除操作
void Delete(LNode*& rear, ElemType& e)
{//删除链表的第一个结点if (rear->next == rear)return;//空表,无法删除元素LNode* p = rear->next->next;//p指向第一个元素e = p->data;rear->next->next = p->next;if (p == rear)rear = p->next;delete p;
}
🎈4.双向链表
双向链表是在单链表的每一个结点里再增加一个指向其直接前驱的指针域
prior,这样形成的链表有两个方向不同的链,故称为双向链表。
🔭4.1类型定义
typedef int ElemType;
typedef struct DNode
{ElemType data;//存放数据元素信息DNode* next;//存放后继结点的地址信息DNode* prior;//存放前驱结点的地址信息
}DNode;
🔭4.2头插法创建双向链表
void CreatList_h(DNode*& head, int n)
{DNode* s;head = new DNode;//创建头结点head->next = head->prior = NULL;//前后指针置为NULLint i = 0;for (i = 0; i < n; i++)//循环创建数据结点{s = new DNode;cin >> s->data;//读入数据s->next = head->next;//连接s的两个指针s->prior = head;if (head->next != NULL)head->next->prior = s;head->next = s;}
}
🔭4.3尾插法创建双向链表
void CreatList_t(DNode*& head, int n)
{DNode* s, * rear;head = new DNode;//创建头结点head->next = head->prior = NULL;//前后指针置为NULLrear = head;int i = 0;for (i = 0; i < n; i++)//循环创建数据结点{s = new DNode;//创建新的数据结点cin >> s->data;//读入数据s->prior = rear;//s插在rear后面rear->next = s;rear = s;}rear->next = NULL;
}
🔭4.4插入操作

void InsertDlist(DNode*& head, int i, ElemType e)
{int j = 0;//计数器DNode* p = head,*s;while (p && j < i - 1){p = p->next;j++;}if (!p || j > i - 1)return;else//找到第i-1个结点{s = new DNode;s->data = e;s->next = p->next;//p结点后插入s结点s->prior = p;if (p->next)p->next->prior = s;}
}
🔭4.5删除操作
DeleteDList()函数在双向链表中,结点的删除操作涉及前驱结点和后继结点两个指针域的变化。设在双向链表中删除指针p所指向结点的后继结点q,需要修改两个指针域,删除操作指针变化过程如图所示:
void DeleteDList(DNode*& head, int i, ElemType& e)
{int j = 0;//计数器DNode* p = head, * q;while (p->next && j < i - 1){p = p->next;j++;}if (!(p->next) || j > i - 1)return;else{q = p->next;e = q->data;p->next = q->next;//删除q所指结点if (q->next != NULL)q->next->prior = p;delete q;}
}
好啦,关于循环链表和双向链表的知识点到这里就结束啦,后期会继续更新数据结构与算法的相关知识,欢迎大家持续关注、点赞和评论!❤️❤️❤️
相关文章:
数据结构与算法-循环链表、双向链表
我们这里接着上一篇单链表继续往下深入学习循环链表、双向链表。 链表 🎈3.循环链表🔭3.1循环链表的概念🔭3.2循环链表的基本操作🔎3.2.1创建空表🔎3.2.2插入操作🔎3.2.3删除操作 🎈4.双向链表&…...
javascript中依次输出元素并不断循环实现echarts柱图动画效果
循环来遍历数组并输出其中的元素 在JavaScript中,你可以使用循环来遍历数组并输出其中的元素。如果你想要依次输出6个元素并不断循环,可以使用如下的代码: let arr [/* 你的数组 */];for (let i 0; i < arr.length; i) {console.log(a…...
互联网Java工程师面试题·Memcached篇·第一弹
目录 1、Memcached 是什么,有什么作用? 1.1 memcached 服务在企业集群架构中有哪些应用场景? 1.1.1 作为数据库的前端缓存应用 1.1.2 作业集群的 session 会话共享存储 2、Memcached 服务分布式集群如何实现? 3、Memcach…...
git 详解-提升篇
git 冷门使用 承接上一篇 《git 进阶篇》,简单讲解 git 冷门使用方法。 码农常规使用工具 git 偶尔也有非常规操作。例如:提交代码时同事已经更新,但又不想回退本地补丁;或者已经提交补丁需要变更提交日志信息。 作者࿱…...
RPA的安全风险及应对策略
RPA已经深度革新了工作流程,大大提升效率并减少了人为错误,使企业运营更加高效。据预测,至2030年,全球RPA市场将以39.9%的复合年增长率持续发展,这显示了RPA对企业生产力的巨大推动力。 RPA能够承担人类的繁琐工作&am…...
数据结构与算法--贪心算法
数据结构与算法-贪心算法 1 贪心算法的概念 2 贪心算法的套路 3 贪心算法常用技巧 4 会议问题 5 字典序问题 1 贪心算法的概念 在某一标准下,优先考虑最满足标准的样本,最后考虑不满足标准的样本,最终得到一个答案的算法,叫做贪心算法 也就是说 不是从整体上加以考虑,所…...
【Unity3D】UGUI物体世界坐标转屏幕坐标问题
如题: UGUI物体世界坐标转屏幕坐标问题,获取UI(UGUI)屏幕坐标问题等相关问题 思路:必须使用Canvas身上的Camera,进行Camera.WorldToScreenPoint(UI物体的世界坐标Vector3),会返回一个Vector3(x,y,z),我们要…...
代码随想录二刷day51
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣309. 买卖股票的最佳时机含冷冻期二、力扣714. 买卖股票的最佳时机含手续费 前言 一、力扣309. 买卖股票的最佳时机含冷冻期 class Solution {public …...
接口自动化测试框架(pytest+allure+aiohttp+ 用例自动生成)
近期准备优先做接口测试的覆盖,为此需要开发一个测试框架,经过思考,这次依然想做点儿不一样的东西。 接口测试是比较讲究效率的,测试人员会希望很快能得到结果反馈,然而接口的数量一般都很多,而且会越来越…...
[Python入门教程]01 Python开发环境搭建
Python开发环境搭建 本文介绍python开发环境的安装,使用anaconda做环境管理,VS code写代码。搭建开发环境是学习的第一步,本文将详细介绍anaconda和vs code的安装过程,并测试安装结果。 视频教程链接:https://www.bil…...
第四章:最新版零基础学习 PYTHON 教程(第二节 - Python 数据类型—Python 字符串、列表、元组、迭代)
在在上一节文章中,我们了解了 Python 的基础知识。现在,我们继续了解更多 Python 概念。 Python 中的字符串: 字符串是字符序列,可以是字母、数字和特殊字符的组合。在Python中可以使用单引号、双引号甚至三引号来声明它。这些引号不是字符串的一部分,它们仅定义字符串…...
react框架与vue框架的区别
React和Vue都是前端开发中常用的框架,它们有一些不同的特性和优点。下面是它们的主要区别: 数据流和数据绑定:React是一种单向数据流的框架,而Vue则是双向数据绑定的框架。这意味着在React中,数据从组件的state属性流…...
C++_pen_静态与常量
成员 常成员、常对象(C推荐使用 const 而不用#define,mutable) const 数据成员只在某个对象生存周期内是常量,而对于整个类而言却是可变的(static除外) 1.常数据成员(构造函数初始化表赋值) c…...
ToDoList使用自定义事件传值
MyTop与MyFooter与App之间传递数据涉及到的就是子给父传递数据,MyList和MyItem与App涉及到爷孙传递数据。 之前的MyTop是使用props接收App传值,然后再在methods里面调用,现在使用自定义事件来处理子组件和父组件之间传递数据。 图是之前的…...
基于SSM的家庭财务管理系统设计与实现
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…...
OpenHarmony Trace的使用
背景: 近期很多开发者反馈OpenHarmony三方库Imageknife有性能问题:连续拖动很多张图片时,界面有明显的卡顿现象。 因为对这个三方库的源码并不了解,因此需要了解目前Imageknife渲染花费了多少时间,最初想的是只有通过…...
文件上传笔记
一、上传的简单绕过: 1、若是上传的文件只在前端的代码中进行了过滤: (1)可以直接在开发者工具中删除相关代码: (2)也可以通过 burpsuite 绕过: 上传时,先提前修改 php 文件的后缀…...
计算机网络 第三章数据链路层
参考视频:计算机网络 文章目录 1、数据链路层概述2、链路层基本概念:节点3、链路层基本概念:链路与数据链路、帧4、封装成帧:字符计数法和字符填充法5、封装成帧:零比特填充法6、封装成帧:违规编码法7、差…...
浅析如何在抖音快速通过新手期并积累粉丝
抖音是一款非常受欢迎的短视频分享平台,它提供了一个快速成名和积累粉丝的机会。对于新手来说,通过四川不若与众总结的以下几个步骤可以帮助你快速通过抖音的新手期。 首先,确定你的内容定位。在抖音上,有各种各样的内容类型&…...
英文论文实例赏析——如何写前言?
写作与实验、统计一样重要 研究生的学习往往会遵循这样的过程:实验——数据分析——写作。虽然写作是最后进行的,但写作的学习这应该和实验的学习、数据分析的学习保持同步,因为写作与统计和实验技能一样,是科研工具箱的必…...
百考通AI:任务书智能生成,让学术研究起步更清晰规范
在学术研究与项目开展的初期,一份逻辑严谨、要求明确的任务书是指引方向的核心纲领,却也让无数研究者倍感困扰:从梳理研究内容到明确技术目标,从规范格式到细化要求,繁琐的撰写流程常常耗费大量时间与精力。百考通AI&a…...
目标函数(含罚函数处理)
蜣螂优化(DBO)算法 工程实际,求目标函数最小值,图中所求例子为一个压力容器设计成本最小,为4变量,4个不等式约束。 采用罚函数将4约束问题转变为无约束问题。 代码注释完整,非常容易带入自己想要求的问题。深夜撸代码发…...
单片机振荡周期,机器周期,指令周期
振荡周期:振荡器产生的时钟信号...
2025_NIPS_Praxis-VLM: Vision-Grounded Decision Making via Text-Driven Reinforcement Learning
一、主要内容总结 1. 研究背景与问题 现有视觉语言模型(VLMs)在多模态任务中表现出色,但缺乏复杂场景下的情境推理能力,难以支撑机器人、交互式助手等领域的决策需求。传统增强VLMs推理能力的方法依赖大规模图文配对数据,这类数据标注成本高、获取难度大,尤其在多样化现…...
Win11组播通信故障排查:从防火墙配置到网卡优化的全流程解析
1. 组播通信故障排查入门指南 最近在帮朋友调试智能家居系统时遇到一个典型问题:多台Win11设备之间组播通信总是失败,单台设备收发正常,但一到多设备协同就出问题。这种组播通信故障在物联网、视频会议等场景特别常见,今天我就把完…...
基于GDAL的温度植被干旱指数计算全流程(附完整Python代码)
基于GDAL的温度植被干旱指数计算全流程实战指南 遥感技术在现代农业、生态监测和灾害预警中扮演着关键角色。当我们面对广袤的土地,如何快速准确地评估土壤水分状况?温度植被干旱指数(TVDI)作为一种基于光学与热红外遥感数据的反…...
PT100温度传感器在家电维修中的妙用:用万用表快速诊断冰箱/空调故障
PT100温度传感器在家电维修中的妙用:用万用表快速诊断冰箱/空调故障 在维修车间里,一台反复报错的变频空调和一台冷藏室结霜的智能冰箱正等待诊断。经验丰富的维修师傅不会急着拆压缩机或加注制冷剂,而是先掏出万用表对准那个不起眼的金属探头…...
Qwen2.5-32B-Instruct保姆级教程:Ubuntu20.04环境部署全流程
Qwen2.5-32B-Instruct保姆级教程:Ubuntu20.04环境部署全流程 想快速体验强大AI助手却卡在部署环节?这篇教程将手把手带你完成Qwen2.5-32B-Instruct在Ubuntu20.04上的完整部署流程。 1. 环境准备与系统要求 在开始部署之前,先确认你的硬件和系…...
鸿蒙应用开发全流程指南
鸿蒙应用上架全流程解析 开发鸿蒙应用从构思到上架需经历多个关键环节。以智能家居控制应用为例,完整流程包含环境配置、功能开发、测试调试、应用打包及商店提交。 环境准备与项目创建 安装DevEco Studio 3.1及以上版本,配置Node.js和OHPM依赖管理工具。…...
软考通关秘籍:技术要点全解析
软考-分析:技术类考试要点与备考策略 软考(计算机技术与软件专业技术资格(水平)考试)是国内权威的IT职业资格认证考试,涵盖多个技术领域。分析软考的技术类考试内容、备考方法及实际应用场景,对…...


