之前单链表中,数组全初始化为0,末尾最后一个next 存的就是0,指向的就是头节点

循环链表的基本概念

循环链表是一种特殊的链表,其尾节点的指针域指向头节点,形成一个闭环。与普通单链表相比,循环链表的遍历需要额外注意终止条件,避免无限循环。


循环链表的节点结构

循环链表的节点与普通链表节点相同,包含数据域和指针域。以C语言为例:

typedef struct Node {int data;           // 数据域struct Node *next;  // 指针域,指向下一个节点
} Node;


循环链表的初始化

初始化时,头节点的指针域指向自身,形成空循环链表:

Node* initList() {Node *head = (Node*)malloc(sizeof(Node));if (head != NULL) {head->next = head;  // 头节点指向自身}return head;
}


循环链表的插入操作

头插法

新节点插入到头节点之后:

void insertAtHead(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;
}

尾插法

新节点插入到尾节点之后(需先遍历到尾节点):

void insertAtTail(Node *head, int data) {Node *current = head;while (current->next != head) {current = current->next;}Node *newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head;current->next = newNode;
}


循环链表的删除操作

删除指定值的节点:

void deleteNode(Node *head, int data) {Node *current = head;while (current->next != head) {if (current->next->data == data) {Node *temp = current->next;current->next = temp->next;free(temp);return;}current = current->next;}
}


循环链表的遍历

遍历时需检查是否回到头节点:

void traverseList(Node *head) {Node *current = head->next;while (current != head) {printf("%d ", current->data);current = current->next;}printf("\n");
}


循环链表的销毁

释放所有节点内存,避免内存泄漏:

void destroyList(Node *head) {Node *current = head->next;while (current != head) {Node *temp = current;current = current->next;free(temp);}free(head);
}


注意事项

  1. 终止条件:循环链表的遍历和操作需明确终止条件(如current != head),否则会陷入无限循环。
  2. 边界处理:空链表时需确保头节点指向自身。
  3. 内存管理:动态分配的内存需及时释放。

通过上述方法,可以完整实现循环链表的基本操作。

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

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

相关文章

20250727让飞凌OK3576-C开发板在Rockchip的原厂Android14下通过耳机播音

20250727让飞凌OK3576-C开发板在Rockchip的原厂Android14下通过耳机播音 2025/7/27 23:28缘起:很容易知道 飞凌OK3576-C开发板 使用的声卡芯片是 NAU88C22YG 新唐科技(NUVOTON) NAU8822LYG NAU88C22YG 新唐立体声音频编解码芯片原理图:OK3576-C V1.2_202…

正向代理和反向代理的理解

**正向代理(Forward Proxy)和反向代理(Reverse Proxy)**是两种不同类型的代理服务器,它们在数据传输过程中扮演的角色、使用场景以及工作方式都有所不同。 正向代理(Forward Proxy) 定义与作用&…

Java 后端 Cookie Session Token会话跟踪技术

概述 会话从字面理解就是"两方交流",那问题就来了,HTTP(超文本传输协议)里面的"传输"不就包含了"两方交流"的意思吗?为什么要多此一举提出会话技术呢? 谈到这个,…

智谱AI GLM大模型 GLM-4-Plus的快速使用 ChatOpenAI类来调用GLM-4模型

智谱AIGLM-4,2024年1月16日发布的第四代基座大模型,其整体性能相较前代提升近60%,多维度指标逼近OpenAI的GPT-4水平。该模型支持128K上下文窗口(约300页文本处理能力),在长文本信息处理中实现100%精度召回。…

AsyncLocal浅复制的问题解决方案

针对C#中AsyncLocal<T>浅复制问题&#xff0c;以下是几种主要的解决方案&#xff1a; 1. 使用不可变对象&#xff08;推荐&#xff09; 将存储在AsyncLocal<T>中的对象设计为不可变的&#xff0c;避免修改共享状态&#xff1a; public class ImmutableUserContext …

IIS发布.NET9 API 常见报错汇总

记录工作过程中发现的IIS常见错误。 1. HTTP Error 500.19 - Internal Server Error .NET 9 API --》vs打包方式如下&#xff1a; 发布到IIS后报错HTTP Error 500.19 - Internal Server Error。 解决方案&#xff1a; 下载ASP.NET Core Hosting Bundle&#xff08;ASP.NET Co…

Google Chrome V8< 13.7.120 沙箱绕过漏洞

【严重】Google Chrome V8< 13.7.120 沙箱绕过漏洞 漏洞描述 V8 是 Google 开发的一款开源高性能 JavaScript 和 WebAssembly 引擎&#xff0c;广泛用于 Chrome 浏览器和 Node.js 等项目中。 受影响版本中&#xff0c;JsonParser::MakeString 函数在处理长度为 1 的转义字…

基于Spring Boot和Vue电脑维修平台整合系统的设计与实现

用户&#xff1a;注册&#xff0c;登录&#xff0c;在线报修&#xff0c;维修接单&#xff0c;维修报告&#xff0c;维修评价&#xff0c;个人资料维修工&#xff1a;登录&#xff0c;在线报修&#xff0c;维修接单&#xff0c;维修报告&#xff0c;维修评价&#xff0c;通知公…

InsightFace(RetinaFace + ArcFace)人脸识别项目(预训练模型,鲁棒性很好)

背景介绍 这是一个 简单的人脸识别项目&#xff0c;用 FastApi 在本地实现&#xff0c;使用预训练模型&#xff0c;直接可用。 新方案比之前的FaceNet强太多了&#xff0c;甚至不用数据增强等操作&#xff0c;就可以识别戴眼镜、不戴眼镜、歪着的人脸等。 充分证明了选型的重要…

App Inventor 2 使用 MaterialIcons 图标字体,快捷展示专业图标

平时布局的话&#xff0c;如果要使用图标&#xff0c;一般需要去找 png 图片&#xff0c;且透明背景的。如果需要根据不同常见图标进行变色的话&#xff0c;就需要准备多张不同样式的图标&#xff0c;还要考虑图片的分辨率等等因素&#xff0c;非常的麻烦。 这时&#xff0c;如…

C语言——关于指针(逐渐清晰版)

为了更好地理解本篇文章的知识内容&#xff0c;读者可以将以下文章作为补充知识进行阅读 &#xff1a; C语言————原码 补码 反码 &#xff08;超绝详细解释&#xff09;-CSDN博客 C语言————二、八、十、十六进制的相互转换-CSDN博客 C语言————斐波那契数列的理解…

SVG 在线编辑器

SVG 在线编辑器 引言 随着互联网技术的发展&#xff0c;矢量图形在网页设计和数据可视化中扮演着越来越重要的角色。SVG&#xff08;可缩放矢量图形&#xff09;因其文件小、无限缩放不模糊的特性&#xff0c;成为了网页设计中常用的图形格式。SVG 在线编辑器的出现&#xff0c…

libpostproc 已经从 ffmpeg 中移除,导致编译 ffmpeg 时没有 libpostproc

今天编译 ffmpeg 时突然发现 libpostproc 不见了&#xff0c;-enable-postproc 也变成了非法的选项。用搜索引擎搜索相关信息找不到一点&#xff0c;于是去 github 看。 从提交记录可以看到 libpostproc 已经被移除了 链接 主线中已经看不到了 libpostproc 这个目录了

基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 显卡直通虚拟机、切换直通

基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 显卡直通虚拟机、切换直通 文章目录 基于 Dell PowerEdge T440 搭建的 Proxmox VE 配置 RTX 3060 显卡直通虚拟机、切换直通 1. 前言 2. 前提条件 3. 配置步骤 3.1. 启用 VT-d 3.2. 激活 IOMMU 3.3. 添加 VFIO 模块 …

如何解决pip安装报错ModuleNotFoundError: No module named ‘voila’问题

【Python系列Bug修复PyCharm控制台pip install报错】如何解决pip安装报错ModuleNotFoundError: No module named ‘voila’问题 摘要 在开发过程中&#xff0c;我们常常会遇到pip安装包时出现各种错误&#xff0c;特别是在使用PyCharm进行开发时。本文将详细介绍如何解决安装…

[spring6: @EnableWebMvc]-源码分析

源码 EnableWebMvc EnableWebMvc 是用于启用 Spring MVC 的注解&#xff0c;它通过导入 DelegatingWebMvcConfiguration 来加载默认的 MVC 配置&#xff0c;同时允许开发者通过实现 WebMvcConfigurer 接口来自定义部分配置&#xff1b;若需更高阶的控制&#xff0c;则可直接继承…

Jmeter的元件使用介绍:(四)前置处理器详解

Jmeter的前置处理器可以用来在取样器执行前做一些数据准备操作&#xff0c;也需要注意使用的作用域问题。常用的前置处理器有&#xff1a;用户参数、BeanShell预处理器、JDBC预处理器。一、用户参数 【用户参数】与前面介绍过的【用户定义的变量】有相似之处&#xff0c;先来介…

十七、K8s 可观测性:全链路追踪

十七、K8s 可观测性&#xff1a;全链路追踪 文章目录十七、K8s 可观测性&#xff1a;全链路追踪1、Skywalking 初识1.1 为什么需要全链路追踪平台1.2 全链路追踪核心组件及工作原理1.2.1 全链路追踪核心概念1.2.2 全链路追踪工作原理1.3 什么是Skywalking&#xff1f;1.4 Skywa…

2025 Gitee vs. GitLab:全面对比与选择指南

在软件研发持续加速、合规要求日益严格的背景下&#xff0c;选择合适的代码托管平台成为团队数字化能力建设的关键环节。尤其在中国本土市场&#xff0c;Gitee正凭借其深度本地化能力、全面生态整合和开源社区支撑&#xff0c;成为国内团队首选的开发协作平台。 一、Gitee&…

期货反向跟单忌讳问题(一): 不断调整盘手交易规则

在期货反向跟单领域&#xff0c;不少运营者在摸着石头过河的过程中&#xff0c;容易陷入一个致命误区——对盘手交易规则的频繁调整。这种看似“优化策略”的举动&#xff0c;往往会让整个跟单体系陷入恶性循环&#xff0c;最终偏离盈利初衷。期货反向跟单的核心逻辑是&#xf…