P1【知识点】【数据结构】【链表LinkedList】C++版

news/2024/6/16 22:20:30/文章来源:https://blog.csdn.net/qq_50891451/article/details/138992913

链表是一种逻辑上连续,内存上分散的线性表数据结构,是用一组任意的空间(可以连续,也可以不连续)来存放数据元素。每个数据元素成为一个”结点“,每个结点由数据域和指针域组成。

  1. 访问元素(Access)O(N)
  2. 搜索元素(Search)O(N)
  3. 插入元素(Insert)O(1)
  4. 删除元素(Delete)O(1)

特点:写的快读的慢(应用于写多读少)

最基本的链表如图所示:

以下参考:数据结构:链表及其C++实现 - 菜鸡刘 - 博客园 (cnblogs.com)

插入操作:

假如需要在C结点后面插入F结点,只需要使C结点的指针指向F,F结点的指针指向结点D即可,如图所示

需要注意的是,在具体实现的时候,需要先暂存C结点的指针,先将其赋值给F结点指针,然后再将F结点的地址赋值给C结点的指针,否则会丢失D结点的地址,链表就会在此处断开。

删除操作:

假如需要删除D结点,则直接让C结点的指针指向E结点即可,如图所示

具体代码实现:

本文利用C++面向对象的特性与模板实现了一个链表类,并实现了插入、删除、查找、拷贝构造、拷贝赋值等基本操作。

结点类实现:
// 链表节点类
template<typename T>
class node
{
public:node() : next(nullptr){} // 这是构造函数node(T val) : data(val), next(nullptr) {} // 这是有参构造
private:T data;node* next;friend class list<T>; //同时在node类中将链表类list声明为友元,便于访问node的成员。
};
链表类声明:

链表类list的声明如下,主要实现了以下操作。list类包含两个成员属性head_ptr和length,前者是链表的头指针,后者储存链表的长度。

template<typename T>
class list
{
public:list(); // 构造函数list(const list<T>& l); // 拷贝构造list<T>& operator= (const list<T>& l); // 拷贝赋值 void insert_node(int index, T val); // 在index处插入结点void del_node(int index); // 删除index处结点T get_node(int index); // 获取index处结点值int find(int value); // 查找值value,找到返回index,找不到返回-1int get_length(); // 获取链表长度void push_back(T val); // 在链表尾部插入数据~list(); // 析构函数private:node<T>* head_ptr; // 链表头指针int length; // 链表长度
};
插入实现:

对于插入操作,本文将其分为了三种情况

  • 超出索引,抛出异常
  • 插在空链表的头
  • 一般情况

// 在index处插入结点
template<typename T>
void list<T>::insert_node(int index, T val)
{if((index > this->length)) // 超过索引,最多可以插到当前结点的下一个结点,否则就是超过索引{throw runtime_error("index out of this list`s range");}else if((this->head_ptr == nullptr) && (index == 0)) // 插在空链表的头{this->head_ptr = new node<T>;this->head_ptr->next = nullptr;this->head_ptr->data = val;this->length++;} else // 一般情况{node<T>* p1 = this->head_ptr;node<T>* p2 = new node<T>;for(int i = 0; i < index - 1; i++){p1 = p1->next;}p2->data = val;p2->next = p1->next;p1->next = p2;this->length++;}
}
删除实现:

删除操作需要注意的是,每个结点都是通过new在堆区申请的内存,因此删除节点需要手动释放其内存。

// 删除index处结点
template<typename T>
void list<T>::del_node(int index)
{node<T>* p1 = this->head_ptr;node<T>* p2 = nullptr;for(int i = 0; i < index - 1; i++){p1 = p1->next;}p2 = p1->next->next;delete p1->next;p1->next = p2;this->length--;
}
索引实现:
// 获取index处结点值
template<typename T>
T list<T>::get_node(int index)
{if(index > this->length - 1) // 超过索引{throw runtime_error("index out of this list`s range");}node<T>* p1 = this->head_ptr;for(int i = 0; i < index; i++){p1 = p1->next;}return p1->data;
}
查找实现:
// 查找值value,找到返回index,找不到返回-1
template<typename T>
int list<T>::find(int value)
{node<T>* p1 = this->head_ptr;for(int i = 0; i < this->length; i++){if(p1->data == value){return i;}p1 = p1->next;}return -1;
}
析构实现:

析构函数需要做的就是释放链表每个节点的内存。

// 析构函数
template<typename T>
list<T>::~list()
{// 清空链表node<T>* p1 = this->head_ptr;node<T>* p2 = p1->next;while(p2 != nullptr){delete p1;p1 = p2;p2 = p2->next;}delete p1;this->length = 0;this->head_ptr = nullptr;} 

力扣练习:

【203】移除链表元素

【206】反转链表

视频来源:【数据结构2】链表Linkedlist_哔哩哔哩_bilibili 

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

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

相关文章

ClickHouse配置与使用

静态IP配置 # 修改网卡配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33# 修改文件内容 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.18.128 NETMASK255.255.255.0 GATEWAY192.168.18.2 DEFROUTEyes IPV4_FAILURE_FATALno IPV6INIT…

SpringAI+Ollama三部曲之一:极速体验

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos Spring AI实战全系列链接 Spring AI实战之一&#xff1a;快速体验(OpenAI)SpringAIOllama三部曲之一&#xff1a;极速体验 关于ollama ollama和LLM&#x…

GMSL图像采集卡,适用于无人车、自动驾驶、自主机器、数据采集等场景,支持定制

基于各种 系列二代 G MS L 图像采集卡&#xff08;以下简称 二代图像采集卡&#xff09;是一款自主研发的一款基于 F P G A 的高速图像产品&#xff0c;二代图像采集卡相比一代卡&#xff0c;由于采用PCIe G en 3 技术&#xff0c;速度和带宽都相应的有了成 倍的提高。该图像…

HDR 视频相关标准-HDR vivid (一)

一、HDR vivid 概况 高动态范围&#xff08;High-DynamicRange&#xff0c;HDR&#xff09;作为超高清音视频产业的关键技术之一&#xff0c;比传统的标准动态范围&#xff08;StandardDynamicRange&#xff0c;SDR&#xff09;拥有更广的色彩容积和更高的动态范围&#xff0c;…

农业信息|基于SSM+vue的农业信息管理系统的设计与实现(源码+数据库+文档)

农业信息管理系统 目录 基于SSM&#xff0b;vue的农业信息管理系统的设计与实现 一、前言 二、系统设计 三、系统功能设计 1系统功能模块 2管理员功能模块 3种植户功能模块 4用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 …

【华为】BFD与静态路由和RIP联用

【华为】BFD与静态路由和RIP联用 实验需求配置AR1AR2AR3AR4效果抓包查看 实验需求 如上图组网所示&#xff0c;在R1上配置到达R4的Loopback0。 4.4.4.4/32网段的浮动静态路由&#xff0c;正常情况下通过R3访问R4。 当R3故障时&#xff0c;自动选路通过R2访问R4的Loopback0;在R…

免费,Python蓝桥杯等级考试真题--第6级(含答案解析和代码)

Python蓝桥杯等级考试真题–第6级 一、 选择题 答案&#xff1a;D 解析&#xff1a;4411*4&#xff0c;超出范围&#xff0c;故答案为D。 答案&#xff1a;B 解析&#xff1a;5<8<10&#xff0c;故答案为B。 答案&#xff1a;A 解析&#xff1a;先比较a&#xff0c;然后…

caffe在ARM鲲鹏920-openEuler2309上的环境搭建

caffe 配置环境 caffe cpu-only openblas protobuf 编译caffe需要3.6~3.10版本&#xff0c;否则会报错 dnf install只能安装3.19版本 需要从源码编译&#xff0c;这里选择了3.9版本 protobuf的github仓 从源码编译安装 caffe-gpu mode caffe的gpu模式需要用到cuda make…

表面简单实则暗藏玄机的面试题:Java数组适合做队列吗?

Java数组本身是一种线性数据结构&#xff0c;它可以用来存储一系列固定大小的元素。尽管数组可以用于实现队列的一些基本操作&#xff0c;比如入队&#xff08;enqueue&#xff09;和出队&#xff08;dequeue&#xff09;&#xff0c;但由于其固定的大小&#xff0c;它并不适合…

什么是安全左移如何实现安全左移

文章目录 一、传统软件开发面临的安全挑战二、什么是安全左移四、安全左移与安全开发生命周期&#xff08;SDL&#xff09;三、安全左移对开发的挑战五、从DevOps到DevSecOps六、SDL与DevSecOps 一、传统软件开发面临的安全挑战 传统软件开发面临的安全挑战主要包括以下几个方…

线缆产线中测径仪的安装位置和选型

关键字:激光测径仪,测径仪安装位置,测径仪选型,测径仪的种类,测径仪测头,线缆产线安装位置, 激光测径仪的安装位置和选型&#xff0c;确实需要根据具体的使用环境和需求来决定。 首先&#xff0c;关于安装位置&#xff0c;激光测径仪可以安装在冷却水槽之前或之后。 安装在…

防火墙技术基础篇:解析防火墙的网络隔离机制

防火墙技术基础篇&#xff1a;解析防火墙的网络隔离机制 网络安全在现代社会中扮演着重要的角色&#xff0c;保护网络系统、用户和数据免受未经授权的访问、破坏和窃取。个人、企业和国家都需要加强网络安全意识&#xff0c;采取有效措施保护自身的网络安全。随着网络攻击手段…

FSC认证是什么?森林认证的好处是什么?

FSC认证&#xff08;Forest Stewardship Council&#xff0c;森林管理委员会认证&#xff09;是一种运用市场机制来促进森林可持续经营&#xff0c;实现生态、社会和经济目标的工具。以下是关于FSC认证的详细介绍&#xff1a; 一、FSC认证包括两个方面&#xff1a; 森林经营认…

单向无头链表实现

目录 1. 为什么要有链表&#xff1f; 2. 链表的种类 3. 具体功能实现 &#xff08;1&#xff09;节点结构体定义 &#xff08;2&#xff09;申请节点 &#xff08;3&#xff09;尾插 &#xff08;4&#xff09;尾删 &#xff08;5&#xff09;头插 &#xff08;6&#…

2024042701-disjoint-set

并查集 Disjoint-Set 一、前言 并查集的历史 1964年&#xff0c; Bernard A. Galler 和 Michael J. Fischer 首次描述了不相交的并查集&#xff0c;1975 年&#xff0c;Robert Tarjan 是第一个证明O(ma(n))&#xff08;逆阿克曼函数&#xff09;算法时间复杂度的上限&#x…

免费,scratch蓝桥杯等级考试真题--第18级(含答案解析和代码)

scratch蓝桥杯等级考试真题–第18级 一、 选择题 答案&#xff1a;C 解析&#xff1a;角色隐藏后&#xff0c;图章效果还是正常显示的&#xff0c;所以C选项错误&#xff0c;故答案为C。 答案&#xff1a;D 解析&#xff1a;根据运算可知&#xff0c;2045,3065,408*5&#xff…

生成式AI蔚然成风 店匠科技引领跨境电商新范式

大家知道吗&#xff0c;曾经火遍全网的被喻为中老年服饰一姐的梁晓晴&#xff0c;其实是一位90后。在一个综艺节目中&#xff0c;她在30秒之内变换了116个Pose&#xff0c;让不少观众惊叹不已。对于一个电商平台来说&#xff0c;模特照片的好坏可能直接影响到产品的销量。实际上…

使用Python生成一束玫瑰花

520到了&#xff0c;没时间买花&#xff1f;我们来生成一个电子的。 Python不仅是一种强大的编程语言&#xff0c;用于开发应用程序和分析数据&#xff0c;它也可以用来创造美丽的艺术作品。在这篇博客中&#xff0c;我们将探索如何使用Python生成一束玫瑰花的图像。 准备工作…

深度学习之基于Django+Tensorflow卷积神经网络实时口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 随着全球疫情的持续&#xff0c;佩戴口罩成为了公众日常生活中不可或缺的一部分。特别是在人员密集的…

SDL系列(三)—— SDL2.0 扩展库:SDL_image与SDL_mixer

SDL_image SDL 默认支持的&#xff0c;只能打开 BMP 格式的图片 。 然而我们常见的是 Png jpg 格式的图片&#xff0c;于是我们这节完成 SDL 借用 自带的三方库 &#xff0c;来 完成加载渲染 png 等其他图片格式。 SDL_image 简介 使用 SDL_image &#xff0c;您…