上一篇
在前面的学习中,我们了解了单链表。单链表虽然简单,但它有一个致命的缺点:只能向后搜索,不能向前搜索。为了弥补这个缺陷,双链表(Doubly Linked List)应运而生。它是线性表中非常重要的一种物理存储结构。
双链表的每个节点除了存储数据的 data 域外,还有两个指针域:一个指向下一个节点(next),一个指向上一个节点(prev)。这种结构使得双链表在处理某些复杂问题时比单链表更加高效。
在C语言中,我们通常这样定义一个带头双向循环链表的节点:
typedef int LTDataType;typedef struct ListNode { LTDataType data; // 数据域 struct ListNode* next; // 指向后继节点 struct ListNode* prev; // 指向前驱节点} LTNode; 带头链表的“头”通常是一个不存储有效数据的哨兵位节点,它的 next 和 prev 在初始化时都指向自己,形成循环。
LTNode* ListInit() { LTNode* phead = (LTNode*)malloc(sizeof(LTNode)); phead->next = phead; phead->prev = phead; return phead;} 双链表的尾插非常高效,由于是循环结构,phead->prev 直接就是尾节点,插入操作的时间复杂度为 O(1)。执行链表操作时,注意指针指向的顺序:
void ListPushBack(LTNode* phead, LTDataType x) { LTNode* tail = phead->prev; LTNode* newNode = (LTNode*)malloc(sizeof(LTNode)); newNode->data = x; tail->next = newNode; newNode->prev = tail; newNode->next = phead; phead->prev = newNode;} | 特性 | 单链表 | 双链表 |
|---|---|---|
| 遍历方向 | 单向 | 双向 |
| 尾插效率 | O(N) | O(1) |
| 内存占用 | 较少 | 较多(多一个指针) |
双链表虽然结构看起来复杂,但由于其对称性,代码实现起来逻辑非常清晰。在实际工程中,数据结构中的双链表常被用于各种高性能缓存(如LRU算法)和调度算法中。掌握双链表,是每一位初学者迈向高级工程师的必经之路!
© 2023 数据结构零基础教学系列 - 线性表篇
本文由主机测评网于2026-04-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20260433597.html