算法模板之单链表图文讲解

在这里插入图片描述
🌈个人主页:聆风吟
🔥系列专栏:算法模板、数据结构
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📋前言
  • 一. ⛳️使用数组模拟单链表讲解
    • 1.1 🔔为什么我们要使用数组去模拟单链表?
    • 1.2 🔔用数组模拟实现单链表
      • 1.2.1 👻整体框架说明
      • 1.2.3 👻单链表插入结点
      • 1.2.4 👻单链表删除结点
    • 1.3 🌟模板提取(重点)🌟
  • 二. ⛳️题目练习
    • 2.1 题目
    • 2.2 输入样例
    • 2.3 输出样例
    • 2.4 c++代码
  • 📝结语

📋前言

    💬 hello! 各位铁子们大家好哇,今天作者给大家带来的是使用使用数组模拟单链表,让我们一起加油进步。
    📚 系列专栏:本期文章收录在《算法模板》,大家有兴趣可以浏览和关注,后面将会有更多精彩内容!
    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝



一. ⛳️使用数组模拟单链表讲解

1.1 🔔为什么我们要使用数组去模拟单链表?

    假如你学过数据结构,那么你对链表的第一反应可能就是:由一系列结点组成,每个结点包含两个域,其中一个域用于存储数据元素,另一个域用于存储下一个结点的地址。节点的表示形式如下:

class Node{
public:int val;Node* next;
};

这种构造形式是我们常见的,使用该方法,在创建 一个值为 x 的新结点的时候,语法如下:

Node* node = new Node();
node->val = x

代码分析:Node* node = new Node();,中间有一个 new 关键字来为新对象分配空间。new 的底层涉及内存分配,调用构造函数,指针转换等多种复杂且费时的操作。由于一秒大概只能 new 一万次左右。在平时的工程代码中,不会涉及上万次的new操作,所以这种使用这种结构创建单链表是一种 见代码知意 的好结构。
    但是在算法比赛中,经常碰到在10w级别以上的链表操作,如果使用结构体这种方式创建链表,是无法在算法规定时间完成的。因此,在算法比赛这种有严格的时间要求的环境中,不能频繁使用new操作。所以在这里我们采用数组去模拟单链表


1.2 🔔用数组模拟实现单链表

1.2.1 👻整体框架说明

初始状态:将头指针head指向空结点。
在这里插入图片描述


插入结点状态:

  • 创建数组valne分别存储某个结点的值和指向下个结点的next指针;
  • 使用数组下表进行关联,通过数组ne将整个链表链接起来;
  • 空结点的下表用 - 1 来表示;

在这里插入图片描述


### 1.2.2 👻单链表查找和修改 因为是使用数组模拟出来的链表,所以对于查找和修改直接通过数组下标进行遍历查找即可,这里就不多叙述。

1.2.3 👻单链表插入结点

1. 头插:将 x 插入到头结点
在这里插入图片描述

代码展示(建议结合图示看注释):

//将x插到头结点
//idx 存储当前已经用到了哪个点,即记录当前下标位置
void add_to_head(int x)
{val[idx] = x;//记录要插入结点的数据ne[idx] = head;//将待插结点指向头结点head = idx;//断开头指针head指向的头结点的箭头,改为指向待插入结点idx++;//下标向后移一位,为下一次插入元素做准备。
}

2. 任意位置插入:将 x 插入到下标是k的结点后面
在这里插入图片描述

代码展示(建议结合图示看注释):

//将x插到下标是k的结点后面
//idx 存储当前已经用到了哪个点,即记录当前下标位置
void add(int k, int x)
{val[idx] = x;//记录要插入结点的数据ne[idx] = ne[k];//将待插结点指向下标为k结点的下个结点ne[k] = idx;//断开下标为k到k+1结点的箭头,将下标为k的结点改为指向待插入结点idx++;//下标向后移一位,为下一次插入元素做准备。
}

1.2.4 👻单链表删除结点

将下标为 k 的结点 后面的结点删掉
在这里插入图片描述

代码展示(建议结合图示看注释):

//将下标是k的点后面的点删掉
void remove(int k)
{ne[k] = ne[ne[k]];//让k指向的改为指向下下个结点,那中间的那个结点就被挤掉了。
}

1.3 🌟模板提取(重点)🌟

模板代码

// head 表示头结点的下标
// val[i] 表示结点i的值
// ne[i] 表示结点i的next指针是多少
// idx 存储当前已经用到了哪个点,即记录当前下标位置
int head, val[N], ne[N], idx;//初始化
void init()
{head = -1;//将头指针head指向空结点。idx = 0;//下标置为0
}//将 x 插入到头结点
void add_to_head(int x)
{val[idx] = x; ne[idx] = head;head = idx;idx++;
}//将 x 插入到下标是k的结点后面
void add(int k, int x)
{val[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx++;
}//将下标是k的点后面的点删掉
void remove(int k)
{ne[k] = ne[ne[k]];
}


二. ⛳️题目练习

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

2.1 题目

在这里插入图片描述

2.2 输入样例

3
H  9
I   1  1
D  1

2.3 输出样例

9

2.4 c++代码

#include <iostream>using namespace std;const int N = 100010;
// head 表示头结点的下标
// val[i] 表示结点i的值
// ne[i] 表示结点i的next指针是多少
// idx 存储当前已经用到了哪个点,即记录当前下标位置
int head, val[N], ne[N], idx;//初始化
void init()
{head = -1;idx = 0;
}//将 x 插入到头结点
void add_to_head(int x)
{val[idx] = x; ne[idx] = head;head = idx;idx++;
}//将 x 插入到下标是k的结点后面
void add(int k, int x)
{val[idx] = x;ne[idx] = ne[k];ne[k] = idx;idx++;
}//将下标是k的点后面的点删掉
void remove(int k)
{ne[k] = ne[ne[k]];
}int main()
{int m;cin >> m;init();//切记:初始化while(m--){int k, x;char op;cin >> op;//判断执行哪种操作if(op == 'H'){//执行头插操作cin >> x;add_to_head(x);}else if(op == 'D'){//执行删除操作cin >> k;if(k == 0) head = ne[head];//删除头节点remove(k - 1);//注意删除第k个输入后面的数,那函数里放的是下标,k要减去1}else{//执行指定位置插入操作cin >> k >> x;add(k - 1, x);}}for(int i = head; i != -1; i = ne[i]) cout << val[i] << " ";cout << endl;return 0;
}


📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
在这里插入图片描述

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

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

相关文章

【TB作品】基于单片机的实验室管理系统,STM32,GM65二维码扫描模块

硬件&#xff1a; &#xff08;1&#xff09;STM32F103C8T6最小板&#xff08;&#xff09; &#xff08;2&#xff09;GM65二维码扫描模块 &#xff08;3&#xff09;DS1302实时时钟模块 &#xff08;4&#xff09;AT24C02 存储设备 &#xff08;5&#xff09;蜂鸣器 &#xf…

同义词替换降低论文重复率的最新研究成果 神码ai

大家好&#xff0c;今天来聊聊同义词替换降低论文重复率的最新研究成果&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff0c;可以借助此类工具&#xff1a; 标题&#xff1a;同义词替换降低论文重复率的最新研…

Element-Ui定制Dropdown组件

1.效果 说明&#xff1a;移入后新增图标&#xff0c;然后移入后图标变色。当然大家可以想到用mouseover移入事件来实现移入颜色的变化&#xff0c;但是在使用Dropdown组件的时候&#xff0c;不支持这种写法。因此采用了原生的遍历对象的形式&#xff0c;为每一个item对象绑定鼠…

拆东墙补西墙-中国金融风控多头借贷数据分析

引言 在中国的金融行业中&#xff0c;多头借贷是一个备受关注的话题。多头借贷是指一个借款人同时从多个金融机构借款&#xff0c;这种行为可能会增加借款人的还款压力&#xff0c;也会增加金融机构的风险。因此&#xff0c;对多头借贷的风险进行有效的监控和分析对于金融机构…

【Nginx】Nginx了解(基础)

文章目录 Nginx产生的原因Nginx简介Nginx的作用反向代理负载均衡策略动静分离 Nginx的Windows下的安装Linux下的安装Nginx常用命令 负载均衡功能演示 Nginx产生的原因 背景 一个公司的项目刚刚上线的时候&#xff0c;并发量小&#xff0c;用户使用的少&#xff0c;所以在低并发…

lv12 uboot移植深化 9

u-boot-2013.01移植 【实验目的】 了解u-boot 的代码结构及移植的基本方法 【实验环境】 ubuntu 14.04发行版FS4412实验平台交叉编译工具arm-none-linux-gnueabi- 【注意事项】 实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 1 建立自己的平台 1.…

flutter 代码混淆

Flutter 应用混淆&#xff1a; Flutter 应用的混淆非常简单&#xff0c;只需要在构建 release 版应用时结合使用 --obfuscate 和 --split-debug-info 这两个参数即可。 –obfuscate --split-debug-info 用来指定输出调试文件的位置&#xff0c;该命令会生成一个符号映射表。目前…

【TB作品】基于单片机的机械通风控制系统,实时温度和二氧化碳浓度

硬件&#xff1a; &#xff08;1&#xff09;51系列单片机&#xff0c;拟采用STC89C52RC&#xff1b; &#xff08;2&#xff09;DS18B20温度传感器&#xff1b; &#xff08;3&#xff09;二氧化碳浓度传感器&#xff1a;https://item.taobao.com/item.htm?spma21n57.1.0.0.1…

紫光展锐CEO任奇伟博士:展锐5G芯筑基当下,迈向未来

12月5日&#xff0c;紫光集团执行副总裁、紫光展锐CEO任奇伟博士受邀出席2023世界5G大会5G产业强基发展论坛&#xff0c;发表了题为《展锐5G芯&#xff1a;筑基当下&#xff0c;迈向未来》的演讲。 ​ 世界5G大会由国务院批准&#xff0c;国家发展改革委、科技部、工信部与地方…

小程序使用Nodejs作为服务端,Nodejs与与MYSQL数据库相连

小程序使用Nodejs作为服务端,Nodejs与MYSQL数据库相连 一、搭建环境二、配置Nodejs三、与小程序交互四、跨域处理/报错处理五、nodejs连接mysql数据库六、微信小程序连接nodejs报错七、小程序成功与服务端相连,且能操作数据库一、搭建环境 新建空文件夹:Win + R进入cmd命令界…

再不跳槽,就晚了

从时间节点上来看&#xff0c;3月、4月是每年跳槽的黄金季&#xff01; 以 BAT 为代表的互联网大厂&#xff0c;无论是薪资待遇、还是平台和福利&#xff0c;都一直是求职者眼中的香饽饽&#xff0c;“大厂经历” 在国内就业环境中无异于一块金子招牌。 现在年底了&#xff0…

【推荐系统】推荐算法数学基础

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍推荐系统涉及的数学知识、推荐系统涉及的概率统计知识。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下吧】 上一篇文章&#xff1a;《【推…

R语言|分面中嵌入趋势线

简介 关于分面的推文&#xff0c;小编根据实际科研需求&#xff0c;已经分享了很多技巧。例如&#xff1a; 分面中添加不同表格 分面中添加不同的直线 基于分面的面积图绘制 分面中的细节调整汇总 基于分面的折线图绘制 最近科研中又遇到了与分面相关的需求&#xff1a;…

CF1898C Colorful Grid(构造)

题目链接 题目大意 n 行 m 列 的一个矩阵&#xff0c;每行有m - 1条边&#xff0c;每列有 n - 1 条边。 问一共走 k 条边&#xff0c;能不能从 &#xff08;1&#xff0c; 1&#xff09;&#xff0c;走到&#xff08;n&#xff0c; m&#xff09;&#xff0c;要求该路径上&am…

【一文带你掌握Java中方法定义、调用和重载的技巧】

方法的定义和调用 方法的定义 方法&#xff08;method&#xff09;是一段用于实现特定功能的代码块&#xff0c;类似于其他编程语言中的函数&#xff08;function&#xff09;。方法被用来定义类或类的实例的行为特征和功能实现。方法是类和对象行为特征的抽象表示。方法与面向…

十八)Stable Diffusion使用教程:艺术二维码案例

今天说说怎么样使用SD生成艺术二维码。 我们直接上图。 方式有三种,分别如下: 1)方式一:直接 contronet 的tile模型进行控制 使用QRBTF Classic生成你的二维码。 首先输入网址,选择喜欢的二维码样式(推荐第一种就行): 然后选择相应参数,这里推荐最大的容错率,定…

JieLink+智能终端操作平台存在弱口令漏洞

产品简介 捷顺JeLink智能终端操作平台(JSOTC2016 fJeLink)是捷顺历经多年行业经验积累&#xff0c;集智能硬件技术视频分析技术、互联网技术等多种技术融合&#xff0c;基于B/S架构&#xff0c;实现核心业务处理模型(用户中心、投权中心财务中心中心值班室、 运维中心车行客户…

《地理信息系统原理》笔记/期末复习资料(11. GIS的输出与地图可视化)

目录 11. GIS的输出与地图可视化 11.1. GIS的输出 11.1.1. 输出方式 11.1.2. GIS的图形输出设备 11.2. 地图符号 11.2.1. 地图符号的实质 11.2.2. 地图符号的分类 11.2.3. 地图符号的设计要求 11.3. 专题信息表达 11.3.1. 专题地图的基本概念 11.3.2. 专题地图的表示…

boost graph之基础

结构 属性相关 #mermaid-svg-LUDFVluXTOlnqK0d {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-LUDFVluXTOlnqK0d .error-icon{fill:#552222;}#mermaid-svg-LUDFVluXTOlnqK0d .error-text{fill:#552222;stroke:#5522…

微软自带浏览器Edge,无法关闭“保存历史记录网站的屏幕截图”解决方案

微软自带浏览器Edge&#xff0c;无法关闭“保存历史记录网站的屏幕截图”解决方案 吐槽1&#xff1a;Windows自带的Chrome内核版本的浏览器Microsofg Edge刚发布时可谓一股清流&#xff0c;启动速度快&#xff0c;占用内存较小&#xff0c;相信很多人也开始抛弃正代Chrome&…