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. 线程安全问题

    • 无任何同步机制
    • 并发操作可能导致:
    ThreadAListThreadBRemoveFirstAddLast完成数据损坏ThreadAListThreadB
  3. 节点归属问题

    • 添加节点时未检查现有归属:
    添加节点
    LinkedList_ != null
    应拒绝添加
    允许添加

🔄 4. 操作原理图解

链表结构
Previous
Next
Previous
Next
Previous
Next
LinkedList
m_first
m_last
Node1
NULL
Node2
Node3
添加节点流程
UserLinkedListNodeANodeBNewNodeAddAfter(NodeA, NewNode)获取Next (NodeB)设置Previous=NodeA设置Next=NodeB设置Next=NewNode设置Previous=NewNode设置LinkedList_=thisUserLinkedListNodeANodeBNewNode
删除节点流程
头节点
尾节点
中间节点
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 + 节点状态验证

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/87856.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RPC/gRPC入门学习

一、RPC 1.1 RPC概念 RPC Remote Procedure Call, 即远程过程调用,是一种用于构建分布式系统的理念,在一些资料中被称为“请求-响应”协议。两个进程可以位于同一系统中,也可以位于不同的系统中,通过网络相互连接。 RPC使程…

租车小程序电动车租赁小程序php方案

电动车租赁小程序源码,开发语言后端php,前端uniapp。四个端:用户端门店端分销商端小程序,pc管理后台。一 用户端:可以扫门店码,进入门店详情页。也可以通过地图找车。或者门店列表进入,或者快速…

Python数据分析基础04:预测性数据分析

相关章节: 《Python数据分析基础03:探索性数据分析》 《python数据分析基础02:数据可视化分析》 《Python数据分析基础01:描述性统计分析》 预测性数据分析(Predictive Analytics) 的深度解析&#xff0…

PFAE(Pyramidal Frequency Attention Extraction)通过频域注意力机制提高边界模糊、遮挡等场景的的检测能力

在伪装物体检测中,现有方法多依赖空间局部特征,难以捕捉全局信息,而 Transformer 类方法计算成本高昂。频率域特征因具备全局建模能力,可有效抑制背景噪声、提升伪装物体语义清晰度,但频域与空域的频繁转换会增加计算复…

AE插件安装方法

Adobe After Effects简称AE,是adobe公司开发的一个视频剪辑及设计软件,AE软件能够实现对素材的非线性编辑而完成画面的组接,同时还能对任何一部分进行修改,达到想要的结果。AE含有很多脚本、常用的表达式和插件,做动画…

舵轮时钟-STM32-28路PWM--ESP8266-NTP时间

1.STM32--PWM生成STM32不具备如此多的PWM,因此采用软件定时器的方案实现:使用hal库实现;main.c#include "main.h"#define close1 500#define open 1500#define close 2500// 定时器中断配置(以TIM2为例) voi…

Redis的单线程和多线程(单Worker线程)

Redis的单线程和多线程 Redis6.0之前是单线程的,6.0之后是多线程的,我们先了解6.0版本之前的单线程Redis。但其实无论6.0之前还是6.0之后,redis用于工作的线程也只有一个,所以也可以说redis一直是单线程的。 Redis单线程 Redis 6.…

OSPFv3基础

文章目录 OSPFv3基础OSPFv3的改进OSPFv2 v3相同OSPFv2 v3不同 🏡作者主页:点击! 🤖Datacom专栏:点击! ⏰️创作时间:2025年07月07日22点31分 OSPFv3基础 OSPFv3协议号依然为89,在I…

前端篇——HTML知识点体系

目录 一、基础结构与文本 1. 文档基础 2. 文本元素 二、多媒体元素 1. 图像 2. 音频 3. 视频 三、列表系统 1. 无序列表 2. 有序列表 3. 定义列表 四、表格系统 1. 表格结构 2. 合并单元格 五、表单系统 1. 输入控件 2. 表单元素 3. 高级表单特性 六、布局系…

产品需求管理文档中,需求模块是怎么界定的

产品需求文档中,需求模块的界定方式主要包括:1、基于业务流程的功能划分、2、按用户角色使用场景分类、3、根据系统架构与技术边界拆解、4、对数据实体和功能点进行组合聚类、5、结合未来演进节奏设置独立迭代单元。 其中,“基于业务流程的功…

国内免代理免费使用Gemini大模型实战

文章目录 一、免费申请Gemini API密钥二、使用openai-gemini1、在github上找到openai-gemini2、将openai-gemini部署到Netlify3、在Cherry Studio中配置和使用gemini的模型1)在Cherry Studio中配置gemini API2)在Cherry Studio中使用gemini 的模型 4、在…

day46-tomcat-java业务部署

1. ✅选型1.1. 🎯中间件java web中间件说明tomcat组件,功能多jetty精简,功能少一些......weblogic使用oracle数据库配合weblogic(商业)国产:东方通(TongWEB)1.2. 📌jdkjdk选型说明jdk(oracle jdk)商业版,jd…

[netty5: HttpServerCodec HttpClientCodec]-源码分析

在阅读该篇文章之前,推荐先阅读以下内容: [netty5: ChannelHandler & ChannelHandlerAdapter]-源码解析[netty5: HttpObjectEncoder & HttpObjectDecoder]-源码解析 HttpServerCodec HttpServerCodec 是一个 Netty 编解码器,结合 …

华为OD机试 2025B卷 - 数组组成的最小数字(C++PythonJAVAJSC语言)

2025B卷目录点击查看: 华为OD机试2025B卷真题题库目录|机考题库 + 算法考点详解 2025B卷 100分题型 最新华为OD机试 真题目录:点击查看目录 华为OD面试真题精选:点击立即查看 2025华为od 机试2025B卷-华为机考OD2025年B卷 题目描述 给定一个整型数组,请从该数组中选…

Ubuntu下Tomcat的配置

进入Tomcat的conf目录下 1 备份配置文件 cp server.xml server.xml.2下载server.xml&#xff0c;用notepad文本编辑器打开 2 修改Tomcat的端口号 找到如下内容<Connector port"8080" protocol"HTTP/1.1"connectionTimeout"20000"redirectPort…

Docker部Ollama安装、本地大模型配置与One-API接入

Docker 安装 Ollama Ollama 支持 Docker 安装,极大简化了部署流程。以下是具体步骤: 创建ollama文件夹 创建 docker-compose.yaml 文件新建一个 docker-compose.yaml 文件,内容如下: 编辑文件 …

ABB焊接机器人智能节气仪

在现代焊接工业中&#xff0c;ABB焊接机器人凭借其高精度、高效率等优势被广泛应用。而在焊接过程中&#xff0c;节气是一个重要的考量因素&#xff0c;这就凸显出ABB焊接机器人智能节气仪的重要性。ABB焊接机器人节气是提高焊接生产效益的关键环节。传统的焊接过程中&#xff…

摄影后期:使用Photoshop进行暗角控制

方法一&#xff1a;ctrlshiftR调出镜头校正工具&#xff0c;调整晕影 方法二&#xff1a;

pyhton基础【24】面向对象进阶五

目录 十五.多继承的继承顺序 - mro 调用父类方式不同导致结果不同 单继承中的super 简单总结 面试题 十六.魔术方法 魔术方法概述 魔术方法概览 __getattribute__属性 __getattribute__注意事项 常用的魔术方法 __doc__ __module__和__class__ __init__ __del__…

如何保障MySQL客户端连接数据库安全更安全

公司员工或外协人员&#xff0c;直接使用业务账号或高权限账号连接MySQL服务器&#xff0c;如同让数据在连接时减少风险——账号密码易泄露、操作行为难追溯、安全风险陡增&#xff01;尤其是在客户端连接环节&#xff0c;如何确保每一个接入点都安全可控&#xff0c;每一次操作…