🔍 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)
查找操作 (Find)
时间复杂度:O(n)
遍历流程图:
🛡️ 3. 安全性评估
✅ 优点
安全性特性
智能指针管理
空指针检查
节点状态重置
自动内存释放
防止空指针异常
移除后断开所有链接
⚠️ 风险点
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
引用:
LinkedList.h
核心结论:
基础功能完善 :双向链表核心操作实现正确,时间复杂度达标内存管理合理 :使用shared_ptr
避免基础内存泄漏关键缺陷 :循环引用、线程安全、节点归属检测缺失优化方向 :改用weak_ptr
+互斥锁+归属验证的组合方案
建议升级方案: weak_ptr
(前驱指针)+ shared_ptr
(后继指针)+ mutex
+ 节点状态验证