
链表作为数据结构入门的核心知识点,其结构灵活多变。根据指针指向和连接方式的不同,主要可以组合出八种形态。实际开发中最常用的其实是两种:单链表(不带头单向不循环)和双向链表(带头双向循环)。
链表分类与说明
单向或者双向
双向链表不仅包含后继节点指针,还包含前驱节点指针。这意味着不仅能找到当前节点的下一个节点,还可以方便地找到上一个节点。

带头或者不带头
这里的'头节点'特指哨兵位头节点,它不存储有效数据,只用来站岗放哨,简化边界处理。在之前的学习中,有时会把第一个节点表述为头节点,这种说法其实不够严谨,为了区分,我们通常将哨兵位称为头节点。

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

虽然链表结构多样,但带头双向循环链表在实际工程中应用广泛,因为它能极大简化插入、删除时的边界判断逻辑。接下来我们重点拆解这一结构。
双向链表实现
节点定义
双向链表由一个个节点组成,每个节点包含三个部分:前驱指针、后驱指针和数值域。
typedef int LDataType;
typedef struct ListNode {
struct ListNode* prev; // 前驱指针
struct ListNode* next; // 后继指针
LDataType data;
} ListNode;


