C/C++数据结构之循环链表

概述

        循环链表本质上也是一个单向或双向链表,但其最后一个节点的指针并不指向NULL,而是指向链表的第一个节点,从而形成一个闭合的环。这种结构使得在遍历链表时,可以从任意一个节点开始,并最终回到起始点。

        音乐播放软件一般都提供了重复播放的功能,这意味着:当播放列表中的最后一首歌曲播放完毕后,自动跳转至第一首歌曲继续播放。这种功能可以通过循环链表来轻松实现,其中每首歌曲代表链表中的一个节点。可以看到,循环链表非常适合需要重复访问元素的场景,比如:循环队列、时间轮等。

基本操作

        与单向链表类似,单向循环链表的每个节点包含两部分:一部分是存储数据的数据域,另一部分是指向下一个节点的指针。只不过最后一个节点的pNext指针不为NULL,而是指向头节点。

        对单向循环链表进行插入操作时,如果插入位置在中间,则与单向链表的插入逻辑基本相同。如果在头部插入新节点,则新节点的pNext指向当前头节点,尾部节点的pNext指向新节点,然后更新头指针指向新节点。如果链表为空,则新节点的pNext也指向自己。如果在尾部插入新节点,则首先找到链表的尾节点,即pNext指针指向头节点的那个节点;然后,让它的pNext指向新节点,新节点的pNext指向头节点。

        对单向循环链表进行删除操作时,根据要删除的节点位置,调整前一个节点的pNext指针指向被删节点的下一个节点。如果是删除头节点,则需要更新头指针。

        对单向循环链表进行遍历操作时,可以从任意节点开始,沿着pNext指针移动,直到再次到达起始节点为止。

        具体的实现,可参考下面的示例代码。双向循环链表与双向链表的区别,与上面基本类似,这里就不再赘述了。

#include <iostream>
using namespace std;struct Node
{int nData;Node* pNext;
};// 创建新节点
Node* CreateNode(int nData)
{Node* pNode = new Node();pNode->nData = nData;pNode->pNext = NULL;return pNode;
}// 查找前一个节点
Node* FindPrevious(Node* pHead, Node* pTarget)
{if (pHead == NULL || pTarget == NULL){return NULL;}Node* pCurrent = pHead;while (pCurrent->pNext != pTarget){pCurrent = pCurrent->pNext;if (pCurrent == pHead){// 循环了一圈没找到return NULL;}}return pCurrent;
}// 头部插入
void InsertAtHead(Node*& pHead, int nData)
{Node* pNode = CreateNode(nData);if (pHead == NULL){pHead = pNode;// 循环指向自己pNode->pNext = pHead;}else{// 新节点的pNext指向当前头节点pNode->pNext = pHead;// 尾部节点的pNext指向新节点Node *pPre = FindPrevious(pHead, pHead);if (pPre != NULL){pPre->pNext = pNode;}pHead = pNode;}
}// 尾部插入
void InsertAtTail(Node*& pTail, int nData)
{Node* pNode = CreateNode(nData);if (pTail == NULL){pTail = pNode;pNode->pNext = pTail;}else{pNode->pNext = pTail->pNext;pTail->pNext = pNode;// 更新尾节点为新节点pTail = pNode;}
}// 指定位置后插入
bool InsertAfter(Node* pNode, int nData)
{if (pNode == NULL){return false;}Node* pNewNode = CreateNode(nData);pNewNode->pNext = pNode->pNext;pNode->pNext = pNewNode;return true;
}// 删除操作
bool DeleteNode(Node*& pHead, Node* pDelNode)
{if (pHead == NULL || pDelNode == NULL){return false;}// 只有一个节点的情况if (pDelNode->pNext == pDelNode){delete pDelNode;pHead = NULL;return true;}// 找到前一个节点Node* pPrev = FindPrevious(pHead, pDelNode);if (pPrev == NULL){return false;}// 更新指针pPrev->pNext = pDelNode->pNext;// 如果删除的是头节点,更新head指针if (pDelNode == pHead){pHead = pDelNode->pNext;}delete pDelNode;return true;
}// 遍历操作
void TraverseList(Node* pNode)
{if (pNode == NULL){cout << "List is empty" << endl;return;}Node* pCurrent = pNode;do{cout << pCurrent->nData << " -> ";pCurrent = pCurrent->pNext;} while (pCurrent != pNode);cout << "(back to head)" << endl;
}int main()
{Node* pHead = NULL;Node* pTail = NULL;InsertAtTail(pTail, 77);pHead = pTail;InsertAtTail(pTail, 88);InsertAtHead(pHead, 66);InsertAfter(pTail, 99);// 输出:66 -> 77 -> 88 -> 99 -> (back to head)TraverseList(pHead);return 0;
}

总结

        循环链表是一种非常有用的数据结构,它通过改变传统链表最后一个节点的指针指向,形成了一个闭环,使得数据的循环访问变得简单而高效。

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

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

相关文章

Mongodb的教程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、mongodb是什么&#xff1f; 二、mongodb的下载与安装教程 三、mongodb的常见操作 总结 前言 在当今数据驱动的世界中&#xff0c;数据库技术是构建高效…

MySQL视图有什么用?一文读懂虚拟表的六大核心价值

引言 在数据库开发中&#xff0c;你是否遇到过这样的困境&#xff1a;业务人员需要查看复杂关联数据却难以理解多表JOIN&#xff0c;或需要限制某些用户只能访问特定字段&#xff1f;MySQL视图正是为此设计的"数据透视镜"。本文将通过官方定义、典型场景和最佳实践&a…

ubuntu24.04 frps服务器端自动启动设置【2025-08-20】

Ubuntu 24.04采用systemd作为默认的init系统&#xff0c;我们可以通过创建systemd服务单元文件来实现开机自启动。以下是具体实施步骤&#xff1a;创建服务文件使用文本编辑器创建服务配置文件&#xff1a;sudo nano /etc/systemd/system/frps.service编写服务配置内容在文件中…

数据结构与算法-字符串、数组和广义表(String Array List)

3 字符串、数组和广义表&#xff08;String Array List&#xff09; 3.1 字符串&#xff08;String&#xff09; 3.1.1 串的顺序存储 a. 定长顺序&#xff1a; #define MAXLEN 255 // 串的定长顺序存储结构 typedef struct {char ch[MAXLEN 1]; // 字符串数据&#xff0c;…

【网络运维】Shell 脚本编程:if 条件语句

Shell 脚本编程&#xff1a;if 条件语句 if 条件语句概述 if 条件语句是 Linux Shell 脚本编程中最基础且使用频率最高的控制结构之一&#xff0c;其语义类似于自然语言中的“如果…那么…”。熟练掌握 if 语句的用法&#xff0c;是成为一名合格运维工程师的基本要求。 if 语句…

浮点型的位结构和表示的值

位结构float 各部分的含义 符号位&#xff1a; 为 0 表示正数&#xff0c;为 1 表示负数。 指数部分&#xff1a; 指数部分是一个移码。指数部分有 8 位&#xff0c;首先当成无符号整型&#xff0c;则值域是 [0, 255] .因为是移码&#xff0c;所以 移码值 无符号整型值 - 127 …

39_基于深度学习的行人摔倒检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

【系统分析师】高分论文:论企业数据治理

【摘要】 2022年3月&#xff0c;我作为系统分析师及IT 负责人&#xff0c;参加了我司的企业级数据平台建设项目&#xff0c;该项目作为我司在企业数字化转型过程中重要的里程碑&#xff0c;在我司数字化运营中扮演着关键的角色。该项目主要包含企业级数据仓库&#xff0c;数据治…

Seata原理分析

简介Apache Seata™ (incubating) 是什么&#xff1f;Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#x…

力扣 30 天 JavaScript 挑战 第38天 (第九题)学习了 语句表达式的区别 高级函数 promise async await 节流

开始答题 版本一&#xff1a; /*** param {Function} fn* return {Function}*/ var once function(fn) {let runCount0return function(...args){runCountrunCount 1 ? return fn(...args) :return undefined} };/*** let fn (a,b,c) > (a b c)* let onceFn once(fn)…

25年八月份宁德时代社招部分岗位入职Verify测评演绎数字推理SHL题型变更、题库使用说明

开始测评前&#xff0c;请注意:1、挑选一个安静的环境&#xff0c;选择一台网速正常且无任何网络端口限制的电脑进行测评;2、移动设备无法兼容远程监考功能&#xff0c;请使用配备有可正常运作的摄像头的台式机或笔记本电脑&#xff0c;建议使用最新版本的Chrome&#xff0c;Fi…

【KO】前端面试四

以下是剩余题目的详细解答,结合前端知识体系和实际应用场景展开: 91. JS 放在 head 里和放在 body 里有什么区别? 对比维度 放在 <head> 放在 <body> 加载阻塞性 会阻塞页面渲染,需等待 JS 下载/执行完成后,才继续渲染页面 一般放在 </body> 前,页面渲…

[Vid-LLM] 数据集 | 基准测试

第5章&#xff1a;数据集与基准测试 在前一章中&#xff0c;我们探讨了**视频大语言模型(Vid-LLMs)**能够执行的各种"工作"或"功能"&#xff0c;从视频总结到充当智能代理。 我们了解了它们的构建方式和扮演的角色。 但这里有个关键问题&#xff1a;这些惊…

34、扩展仓储管理系统 (跨境汽车零部件模拟) - /物流与仓储组件/extended-warehouse-management

76个工业组件库示例汇总 扩展仓储管理系统 (跨境汽车零部件模拟) 概述 这是一个高级的仓储管理系统 (WMS) 模拟组件&#xff0c;专为展示跨境汽车零部件的复杂物流场景而设计。它模拟了从海外供应商发货&#xff0c;经过海运/空运、清关、质检&#xff0c;到最终入库上架&am…

nodejs koa留言板案例开发

包含功能 登录注册(不开放注册只是用固定的账号信息) 查看列表 查看详情 发布信息 编辑信息 删除信息 项目接口 npm init -y npm install koa --save npm istall koa-router --save (旧版本) 或者 npm install koa/router --save &#xff08;新版本&#xff09; npm instal…

4+ 图论高级算法

强连通分量 基础概念 强连通&#xff1a;在有向图 GGG 中&#xff0c;如果两个点 uuu 和 vvv 是互相可达的&#xff0c;即从 uuu 出发可以到达 vvv , 从 vvv 也可以到达 uuu , 则称 uuu 和 vvv 是强连通的。如果 GGG 中任意两个点都是互相可达的&#xff0c;则称 GGG 是强连通图…

从罗永浩访谈李想中学习现代家庭教育智慧

引言 在这个信息爆炸的时代&#xff0c;每个父母都在寻找培养孩子的最佳方式。在罗永浩与理想汽车创始人李想的深度访谈中&#xff0c;我们看到了一个成功企业家童年成长的真实样本。李想的成长经历为现代家庭教育提供了许多值得深思的启示。 一、正义感与乐观精神的种子 李想回…

AI实现超级客户端打印 支持APP 网页 小程序 调用本地客户端打印

核心思路都是&#xff1a;需要一个安装在用户电脑上的“中间人”程序&#xff08;本地客户端&#xff09;来接管打印任务&#xff0c;然后通过某种通信方式命令这个客户端进行打印。下面我将分平台详细阐述各种实现思路、优缺点和适用场景。一、核心思路与公共组件&#xff1a;…

Java集合(Collection、Map、转换)

✅ 推荐使用 ❌ 已过时 1. Collection Collection 是集合框架的根接口之一&#xff0c;它是所有单列集合&#xff08;如 List、Set、Queue 等&#xff09;的公共父接口。Collection 接口定义了集合的基本操作&#xff0c;比如添加、删除、遍历等。 Collection ├── List │ …

全国网络安全知识竞赛有哪些

全国范围内有多种类型的网络安全知识竞赛&#xff0c;涵盖国家级、行业级、高校、青少年和企业等多个维度。以下是主要的网络安全知识竞赛分类及详细介绍&#xff1a;一、国家级网络安全竞赛"强网杯"全国网络安全挑战赛主办单位&#xff1a;中央网信办、河南省人民政…