数据结构核心:循环双向链表
在单链表的基础上,双向链表为每个节点增加了指向前驱节点的指针。为了进一步简化边界条件的处理(如头插、尾删),我们通常采用带头结点的循环双向链表。这种结构下,头结点不存储有效数据,仅作为哨兵位,且首尾相连形成闭环。
概念与结构
哨兵位的作用
这里的'带头'指的是存在一个不存数据的头结点。它的主要作用是统一操作逻辑,避免对空表或第一个元素进行特殊判断。例如,当链表为空时,头结点的 next 和 prev 都指向自己。
节点定义
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
typedef int LTDataType;
typedef struct ListNode {
LTDataType data;
struct ListNode* next; // 指向后继节点
struct ListNode* prev; // 指向前驱节点
} LTNode;
接口声明
为了保证接口的健壮性,初始化函数直接返回头指针,销毁函数同样返回 NULL 以便检查状态。其他增删改查操作均基于此头指针进行。
// 初始化链表,返回新创建的头结点
LTNode* LTInit();
// 销毁链表,释放所有内存并置空
LTNode* LTDestroy(LTNode* phead);
// 尾插 / 头插
void LTPushBack(LTNode* phead, LTDataType x);
void LTPushFront(LTNode* phead, LTDataType x);
// 尾删 / 头删
void LTPopBack(LTNode* phead);
;
;
;
LTNode* ;
;
;


