
链表是数据结构入门阶段的核心知识点,其结构灵活多变。实际应用中,链表可分为单向/双向、带头/不带头、循环/不循环等多种组合形式。本文先系统梳理链表的分类体系,帮助大家建立完整认知,再重点讲解带头双向循环链表这一高效实用的结构。从节点定义、哨兵位初始化到完整代码实现,一步步带你理解双向链表的设计思想。
一、链表的分类与说明
链表的结构非常多样,理论上总共能组合出 8 种形态。

1.1 单向或者双向
双向链表包含前驱节点和后继节点指针:不仅能找到当前节点的下一个节点,还可以找到上一个节点,在遍历和删除操作上更为方便。

1.2 带头或者不带头
带头链表中的头节点不存储有效数据,只用来站岗放哨,我们称之为'哨兵位'。
在之前的单链表学习中,有时会把第一个节点表述为头节点,其实这个称呼是不严谨的,只是为了方便理解。

1.3 循环或者不循环
循环链表的尾节点不会指向空,而是指向了第一个节点,形成闭环。

虽然有这么多的链表结构,但我们实际中最常用的其实还是两种:单链表(不带头单向不循环链表)和双向链表(带头双向循环链表)。接下来我们继续学习双向链表。
二、双向链表
2.1 双向链表的定义
双向链表由一个个节点组成,每个节点包含三个部分:
- 前驱指针:指向前一个元素的指针
- 后驱指针:指向后一个元素的指针
- 数值域:存储元素数据
typedef struct {
LDataType data;
} ListNode;


