一、链表基础概念
链表是一种线性数据结构,由节点(Node)通过指针连接而成,每个节点包含数据域和指针域。与数组相比,链表具有动态内存分配、高效插入删除等特性,但随机访问效率较低。
1.1 链表核心特性
节点结构示例:
struct Node {
int data;
// 数据域
Node* next;
// 指针域,指向下一个节点 };
时间复杂度对比:
插入/删除:O(1)(已知位置)
随机访问:O(n)
内存利用率:动态分配,无碎片
二、链表实现原理
2.1 单链表操作
创建节点:
Node* newNode(int value) { Node* temp = new Node; temp->data = value; temp->next = nullptr; return temp; }
插入节点(头插法):
void insertHead(Node*& head, int value) { Node* newNode = new Node(value); newNode->next = head; head = newNode; }
2.2 双链表与循环链表
双链表节点结构:
struct DNode { int data; DNode* prev; DNode* next; };
循环链表特点:尾节点指向头节点,形成闭环。
三、链表进阶应用
3.1 典型应用场景
LRU缓存淘汰算法:利用双链表实现快速插入删除。
多项式运算:链表存储多项式项,支持动态扩展。
大数运算:每位作为节点,避免数组长度限制。
3.2 实战优化技巧
哨兵节点(Dummy Node)简化边界处理。
尾指针优化,避免遍历至尾部。
内存池技术减少频繁new/delete开销。
四、链表与STL容器对比
特性
链表(list)
数组(vector)
动态大小
是
自动扩容
插入/删除
O(1)
O(n)
随机访问
不支持
O(1)
内存连续性
否
是
五、常见问题与调试
内存泄漏:确保每个new都有对应的delete。
野指针:删除节点后及时置空指针。
循环引用:双链表需注意prev/next的同步更新。
六、C++11+现代特性
智能指针(shared_ptr/unique_ptr)管理节点内存。
移动语义优化节点赋值效率。
结构化绑定(C++17)简化节点访问。
318

被折叠的 条评论
为什么被折叠?



