C语言:双向链表详解
C语言双向链表详解Doubly Linked List ·哨兵位/带头双向循环 · 前驱后继双指针 · 数据结构的最优形态一、为什么需要双向链表单链表有两个痛点只能从头往后走——找前驱必须重新遍历O(n)删除指定节点要传二级指针可能动头指针双向链表每个节点加一个 prev 前驱指针前后都能走指定位置插入删除 O(1)。二、两种最常用的链表课程强调实际开发中最常用的两种链表**单链表**不带头、不循环——实现简单**双向循环链表**带头、带哨兵位——操作最方便这节讲后者带头双向循环链表。单链表phead → [data|next] → [data|next] → NULL双向循环phead(哨兵) ⇄ [data|prev|next] ⇄ [data|prev|next] ⇄ (回到phead)三、节点结构data next prevtypedef int LTDataType;typedef struct ListNode {LTDataType data;struct ListNode* next; //后继指针struct ListNode* prev; //前驱指针} LTNode;四、哨兵位设计核心思想双向链表带一个哨兵位头结点数据域为 -1仅作标记好处巨大空链表 只剩哨兵位phead-next phead**所有操作传一级指针**——头指针永远不变对比单链表的二级指针插入/删除统一逻辑不用分空/非空讨论// BuyNode中node-next node-prev node; ←自环LTNode* LTInit() {LTNode* phead LTBuyNode(-1); //哨兵位return phead;}⚠ 易错哨兵位 next/prev 初始化为 NULL 是错的必须指向自己自环否则循环结构断裂。五、尾插四步连指针void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);//插入到phead和phead-prev之间newnode-prev phead-prev; // ①新节点前驱原尾newnode-next phead; // ②新节点后继头phead-prev-next newnode; // ③原尾的后继新节点phead-prev newnode; // ④头的前驱新节点}⚠不能交换顺序先改 newnode 的指针①②再改原链表指针③④。反了节点就丢了。六、头插 / 尾删 / 头删//头插插在哨兵位后面void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode LTBuyNode(x);newnode-next phead-next; //新节点后继原第一个newnode-prev phead;phead-next-prev newnode;phead-next newnode;}//尾删void LTPopBack(LTNode* phead) {assert(phead phead-next ! phead); //不能为空LTNode* del phead-prev;del-prev-next phead; //新尾的后继头phead-prev del-prev; //头的前驱新尾free(del);}七、指定位置插入/删除核心优势双向链表在 pos 之后插入不需要找前驱——prev 指针直接拿到//在pos之后插入LTInsertO(1)void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode LTBuyNode(x);newnode-next pos-next;newnode-prev pos;pos-next-prev newnode;pos-next newnode;}//删除pos节点无需知道头指针O(1)void LTErase(LTNode* pos) {assert(pos);pos-next-prev pos-prev; // pos后继的前驱 pos前驱pos-prev-next pos-next; // pos前驱的后继 pos后继free(pos);}这正是双向链表 vs 单链表的核心优势已知节点位置时 O(1) 插入删除。八、打印与销毁//遍历结束条件pcur回到哨兵位void LTPrint(LTNode* phead) {LTNode* pcur phead-next;while (pcur ! phead) { printf(%d-, pcur-data); pcur pcur-next; }printf(\n);}//销毁逐个释放最后释放哨兵位void LTDesTroy(LTNode* phead) {assert(phead);LTNode* pcur phead-next;while (pcur ! phead) {LTNode* next pcur-next; //先存下一个free(pcur);pcur next;}free(phead); //最后释放哨兵位}九、链表分类总览从三个维度给链表分类方向单向 / 双向是否循环循环 / 非循环是否带头哨兵带头 / 不带头推荐组合**单链表不带头不循环 双向循环链表带头**——头尾两把刷子。十、常见错误清单①哨兵位 next/prev 初始化为 NULL应自环指向自己②指针连接顺序颠倒 → 节点丢失先改新节点再改原链表③删除/尾删不判断是否只剩哨兵位 → 误删哨兵④销毁时忘记先存 next → 释放后无法继续遍历⑤ LTErase 中 free 后 posNULL 只改形参——调用后不要再使用 posYesterday is history, tomorrow is a mystery, but today is a gift. That is why it is called the present.—— 乌龟大师, 功夫熊猫— END —

相关新闻

UE5 C++项目创建失败:SDK配置无效导致平台跳过的诊断与修复指南

UE5 C++项目创建失败:SDK配置无效导致平台跳过的诊断与修复指南

1. 项目概述:当UE5 C工程创建“罢工”时最近在启动一个新的UE5 C项目,或者打开一个已有的项目时,有没有遇到过这样的场景:你满怀期待地点击了“生成项目文件”,结果Visual Studio弹出一个对话框,告诉你“正…

2026/10/5 15:17:27 阅读更多 →
C++游戏开发入门:从语言核心到实战避坑指南

C++游戏开发入门:从语言核心到实战避坑指南

1. 从零到一:为什么选择C作为游戏开发的起点?如果你点开这篇文章,大概率和我当年一样,怀揣着亲手创造一个游戏世界的梦想,然后被“C游戏开发”这个看似高耸入云的门槛给唬住了。别怕,这太正常了。我入行十几…

2026/10/2 20:17:15 阅读更多 →
Thanos多集群监控聚合平台在分布式测试中的应用

Thanos多集群监控聚合平台在分布式测试中的应用

1. 项目概述:Thanos多集群监控聚合平台的测试价值在分布式系统测试领域,测试工程师经常面临一个核心痛点:当被测系统由数十个Kubernetes集群组成时,如何快速定位跨集群的性能瓶颈?传统单集群监控方案就像盲人摸象&…

2026/9/28 19:34:32 阅读更多 →

最新新闻

深度解析systemd服务文件:Unit、Service、Install三段式结构与配置实战

深度解析systemd服务文件:Unit、Service、Install三段式结构与配置实战

1. 服务文件的三段式结构,到底在管什么事 搞 Linux 服务管理绕不开 systemd,而 systemd 的一切核心都落在 service 文件上。很多同学第一次打开一个 .service 文件,看到 [Unit] 、 [Service] 、 [Install] 这三段,第一反应…

2026/10/11 15:40:12 阅读更多 →
Spring AI对话持久化实战:自定义表结构+Token消耗统计

Spring AI对话持久化实战:自定义表结构+Token消耗统计

Spring AI 的对话持久化,说难不难,说简单也不简单。团队最近在做的那个 AI 助手项目,上线不到两周,问题清单里排在最前面的不是回答质量,而是两个看着不起眼、实际很要命的事:用户刷新页面之后,…

2026/10/11 15:40:12 阅读更多 →
Spring AI对话持久化与Token统计:基于ChatMemory与Advisor的落地方案

Spring AI对话持久化与Token统计:基于ChatMemory与Advisor的落地方案

1. 项目背景与核心问题拆解 做LLM应用落地时,只要业务稍微有点规模,对话记忆和token统计就是两个绕不开的坎。尤其是Spring AI生态刚起步,很多团队在用的还是"用内存Map硬扛、token靠前端瞎猜、消息记录散落在业务代码里"这种原始状…

2026/10/11 15:40:12 阅读更多 →
220V转24V0.5A-0.8A电源芯片WT5110

220V转24V0.5A-0.8A电源芯片WT5110

220V转24V0.5A-0.8A电源芯片WT5110WT5110是一款用于将220V交流电转换为24V直流电的非隔离型开关电源芯片,适用于0.5A至0.8A的输出电流范围。以下是关于该芯片的关键信息:一、主要特性 输入电压:支持85V~265V AC宽范围输入(兼容220…

2026/10/11 15:40:12 阅读更多 →
ELF与DWARF深度解析:构建二进制一致性分析完整流程

ELF与DWARF深度解析:构建二进制一致性分析完整流程

1. 项目概述:两个二进制到底“一样”吗 做二进制分析这些年,我遇到最多的一个场景往往不是“怎么逆向”,而是“怎么证明这两份二进制是同一个逻辑”。某跨平台系统上线前要做程序一致性审查,团队手里只有编好的可执行文件&#xf…

2026/10/11 15:40:12 阅读更多 →
工业小目标检测:方便面调料包正反识别数据集与落地实践

工业小目标检测:方便面调料包正反识别数据集与落地实践

简介:本资源是面向计算机视觉初学者与工业质检算法工程师的轻量级目标检测数据集,聚焦方便面调料包正反方向识别这一典型产线质检场景。数据由海康相机实拍采集,经人工精细标注,支持YOLOv8等主流框架直接训练,实测mAP达…

2026/10/11 15:39:12 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →