LinkedList 链表数据结构实现 (OPENPPP2)

🔍 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. 核心操作性能分析

📊 时间复杂度对比
🔧 操作性能详解
  1. 添加操作(AddFirst/AddLast/AddAfter/AddBefore)

    • 时间复杂度:O(1)
    • 只需调整相邻节点指针
    • 示例流程:

    Next Next Previous Previous 新节点 原节点 后节点

  2. 删除操作(Remove/RemoveFirst/RemoveLast)

    • 时间复杂度:O(1)
    • 指针调整逻辑:

    Next Previous 前节点 目标节点 后节点

  3. 查找操作(Find)

    • 时间复杂度:O(n)
    • 遍历流程图:

🛡️ 3. 安全性评估

✅ 优点

安全性特性 智能指针管理 空指针检查 节点状态重置 自动内存释放 防止空指针异常 移除后断开所有链接

⚠️ 风险点

shared_ptr 安全风险 循环引用 线程不安全 节点重复添加 内存泄漏风险 并发修改冲突 节点归属混乱

🧪 关键问题分析
  1. 循环引用问题

    • 节点间通过shared_ptr互指
    • 解决方案建议:

    问题 weak_ptr解决 Previous用weak_ptr Next用shared_ptr

  2. 线程安全问题

    • 无任何同步机制
    • 并发操作可能导致:

    ThreadA List ThreadB RemoveFirst AddLast 完成 数据损坏 ThreadA List ThreadB

  3. 节点归属问题

    • 添加节点时未检查现有归属:

    是 否 添加节点 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

核心结论:
  1. 基础功能完善:双向链表核心操作实现正确,时间复杂度达标
  2. 内存管理合理 :使用shared_ptr避免基础内存泄漏
  3. 关键缺陷:循环引用、线程安全、节点归属检测缺失
  4. 优化方向 :改用weak_ptr+互斥锁+归属验证的组合方案

建议升级方案:
weak_ptr(前驱指针)+ shared_ptr(后继指针)+ mutex + 节点状态验证

相关推荐
老师我太想进步了202613 分钟前
【数据结构-4】算法美学之顺序表
数据结构·算法
UIU11431 分钟前
P1481 魔族密码
c++·算法·动态规划
nice_lcj5204 小时前
ThreadLocal 入门:它是怎么隔离数据的、为什么会导致内存泄漏
java·开发语言·后端·面试·并发编程·内存泄漏·threadlocal
紧跟先前的步伐4 小时前
Go AI Agent 实战 28|Agent 的预算、超时与停止条件
开发语言·人工智能·后端·ai·golang
bksczm5 小时前
InnoDB 行格式详解:DYNAMIC / COMPACT / COMPRESSED / REDUNDANT
java·开发语言·数据库
春涧草茶5 小时前
慢就是快16-1协程
开发语言·前端·python
Dovis(誓平步青云)6 小时前
启元 T1 Pro 人机相声搭档:语音-触摸双通道的启元机器人节奏引擎设计
开发语言·前端·javascript·microsoft·交互
做科研的周师兄6 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
闻缺陷则喜何志丹7 小时前
【C++特性】四种类型转
c++·算法·类型转换
.痞老板.7 小时前
java ee--计算机是如何工作的
java·开发语言·java-ee