🔍 LinkedList 链表数据结构实现 (OPENPPP2)
🧱 1. 数据结构设计
LinkedListNode 结构
LinkedListNode - shared_ptr Previous - shared_ptr Next - T Value - LinkedList* LinkedList_
LinkedList 类
LinkedList - shared_ptr m_first - shared_ptr m_last - int m_count +First() +Last() +Count() +IsEmpty() +AddFirst(shared_ptr) +AddLast(shared_ptr) +AddAfter(shared_ptr, shared_ptr) +AddBefore(shared_ptr, shared_ptr) +RemoveFirst() +RemoveLast() +Remove(shared_ptr) +Find(T) +Clear()
⚙️ 2. 核心操作性能分析
📊 时间复杂度对比

🔧 操作性能详解
-
添加操作(AddFirst/AddLast/AddAfter/AddBefore)
- 时间复杂度:
O(1)
- 只需调整相邻节点指针
- 示例流程:
Next Next Previous Previous 新节点 原节点 后节点
- 时间复杂度:
-
删除操作(Remove/RemoveFirst/RemoveLast)
- 时间复杂度:
O(1)
- 指针调整逻辑:
Next Previous 前节点 目标节点 后节点
- 时间复杂度:
-
查找操作(Find)
- 时间复杂度:
O(n)
- 遍历流程图:
- 时间复杂度:
🛡️ 3. 安全性评估
✅ 优点
安全性特性 智能指针管理 空指针检查 节点状态重置 自动内存释放 防止空指针异常 移除后断开所有链接
⚠️ 风险点
shared_ptr 安全风险 循环引用 线程不安全 节点重复添加 内存泄漏风险 并发修改冲突 节点归属混乱
🧪 关键问题分析
-
循环引用问题
- 节点间通过
shared_ptr
互指 - 解决方案建议:
问题 weak_ptr解决 Previous用weak_ptr Next用shared_ptr
- 节点间通过
-
线程安全问题
- 无任何同步机制
- 并发操作可能导致:
ThreadA List ThreadB RemoveFirst AddLast 完成 数据损坏 ThreadA List ThreadB
-
节点归属问题
- 添加节点时未检查现有归属:
是 否 添加节点 LinkedList_ != null 应拒绝添加 允许添加
🔄 4. 操作原理图解
链表结构
Previous Next Previous Next Previous Next LinkedList m_first m_last Node1 NULL Node2 Node3
添加节点流程
User LinkedList NodeA NodeB NewNode AddAfter(NodeA, NewNode) 获取Next (NodeB) 设置Previous=NodeA 设置Next=NodeB 设置Next=NewNode 设置Previous=NewNode 设置LinkedList_=this User LinkedList NodeA NodeB NewNode
删除节点流程
头节点 尾节点 中间节点 Remove操作 节点位置 RemoveFirst RemoveLast RemoveMiddle 备份m_first 设置m_first=原first->Next 重置原first指针 计数减1 获取previous和next previous->Next = next next->Previous = previous
📈 5. 性能优化建议

🎯 总结评估
85 90 70 75 正确性 A_score 性能 B_score 安全性 C_score 扩展性 D_score
引用:
核心结论:
- 基础功能完善:双向链表核心操作实现正确,时间复杂度达标
- 内存管理合理 :使用
shared_ptr
避免基础内存泄漏 - 关键缺陷:循环引用、线程安全、节点归属检测缺失
- 优化方向 :改用
weak_ptr
+互斥锁+归属验证的组合方案
建议升级方案:
weak_ptr
(前驱指针)+shared_ptr
(后继指针)+mutex
+ 节点状态验证