【数据结构与算法】C语言实现双向链表 (Double Linked List) 全解析

一、什么是双向链表?

  1. 核心定义

双向链表是一种线性表,它的每个数据节点不仅存储了指向下一个节点的指针 next ,还多了一个指向前一个节点的指针 prev 。

这意味着:

  • 单链表:只能从头走到尾(单向)。

  • 双向链表:可以从头走到尾,也可以从尾走到头(双向)。

  1. 节点结构 (Node Structure)

每个节点包含三个部分:

  1. prev :前驱指针,指向前一个节点。

  2. val / data :存储的数据。

  3. next :后继指针,指向后一个节点。

在 C 语言中定义如下:

二、双向链表 vs 单链表:优缺点对比

表格
结论:在对插入、删除操作频繁,且需要双向遍历的场景中,双向链表是首选。

三、六大核心操作详解

  1. 基础工具:创建新节点
  2. 核心操作一:头插法 (Push Front)

原理:新节点成为新的头,它的 next 指向旧头,旧头的 prev 指向新节点。

  1. 核心操作二:尾插法 (Push Back)

原理:找到链表尾部,将尾部节点的 next 指向新节点,新节点的 prev 指向尾部节点。

  1. 核心操作三:头删法 (Pop Front)

原理:删除头节点,将新头节点的 prev 置为 NULL 。

  1. 核心操作四:尾删法 (Pop Back)

原理:找到尾节点,将其前驱节点的 next 置为 NULL ,然后释放尾节点。

  1. 核心操作五:指定位置插入 (Insert After)

场景:在某个指定节点 pos 的后面插入新节点。

  1. 核心操作六:指定位置删除 (Delete Node)

场景:删除链表中指定的某个节点 delNode 。

四、辅助函数:打印与释放

五、核心算法:反转双向链表

六、主函数:测试所有功能

七、运行结果

八、深度总结:双向链表的精髓

  1. 永远先保存:在修改指针前,务必用临时变量保存可能丢失的节点地址,避免链表断裂。

  2. 双向更新:插入/删除操作时,要同时更新 prev 和 next 指针,保证双向指向正确。

  3. 边界检查:必须处理链表为空、只有一个节点等边界情况,防止空指针访问。

  4. 内存管理:删除节点后要及时释放内存,避免内存泄漏。

九、总结

双向链表是在单链表基础上扩展出的高效线性表结构,核心思想是为每个节点增加 prev 前驱指针,实现双向遍历与更灵活的操作。

它最大的优势是插入、删除操作效率更高(无需遍历查找前驱节点),支持双向遍历;最大的代价是额外占用一个指针的存储空间,空间复杂度略高于单链表。

掌握双向链表,是深入学习循环链表、LRU缓存、跳表等更高级数据结构的基础,也是面试与考研中高频考察的核心知识点。

如果这篇文章对你有帮助,欢迎点赞、收藏、关注,后续会持续更新数据结构与算法干货,我们一起进步!🚀

相关推荐
xiaoye-duck2 分钟前
《C++ 项目:手写大模型接入 SDK》会话模块整合:内存 SessionManager 与 DataManager 持久化联动
开发语言·数据库·c++·语言模型
Zwawa1 小时前
让屏幕动起来:OLED动画效果,丝滑光标、帧动画和一只贪吃蛇
c语言·单片机·嵌入式
Funlang1 小时前
龙芯上的 Fun:从跑起来到机器码
开发语言·龙芯
总要学点什么1 小时前
第104篇:三维特效-流动墙体效果——让贴图沿墙流动,它却只肯走一条对角线
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
旖旎夜光2 小时前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
ShineWinsu2 小时前
对于Qt:QTabWidget常见属性的解析
开发语言·数据库·c++·qt·浏览器·qtabwidget·标签页
Pniubi2 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
nice_lcj5202 小时前
LRU 缓存入门:它是什么、怎么用、面试怎么手写
java·数据结构·缓存·面试·lru
普通人63 小时前
WebGL与WebGPU入门指南
开发语言·webgl·1024程序员节
꧁细听勿语情꧂3 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法