其他链表
双向链表
每个结点有两个指针域,分别指向前驱和后继,支持双向遍历。代价是每个结点多一个指针,空间开销更大。
typedef struct DNode {
int data;
struct DNode *prior, *next;
} DNode, *DLinkList;
插入操作(在 p 结点后插入 s):
s->prior = p;
s->next = p->next;
p->next->prior = s;
p->next = s;
循环链表
- 循环单链表:最后一个结点的指针指向头结点(或首元结点),使整个链表首尾相连,可从任一结点出发访问全部结点。
- 循环双链表:头结点的 prior 指向尾结点,尾结点的 next 指向头结点。
循环链表常用于需要频繁在首尾操作的场景(如约瑟夫环、操作系统进程调度)。
静态链表
用数组模拟链表,结点的”指针”用数组下标(游标)代替,适用于不支持指针的高级语言或内存受限场景。
习题
习题 1
简述单链表和双链表的区别及各自适用场景。
答案与解析
单链表:每个节点只有一个指向后继的指针,结构简单、占用空间少,适合只需向一个方向遍历的场景。
双链表:每个节点有两个指针分别指向前驱和后继,支持双向遍历,但每个结点多占一个指针空间。适合需要频繁在两个方向移动的场景,如文本编辑器的光标移动、LRU 缓存等。
