C++ 链表

news/2024/9/18 9:00:41/文章来源:https://www.cnblogs.com/Mono-Awen/p/18374504

1. 前言

链表:不仅存储 当前元素的数据,还存储着 元素排列顺序

2. 正题

2.1 如何存储节点?

我们可以使用 结构体 数组来存储 链表节点 

struct Node {int val; // 可以是 string 或其它复杂的类型int nxt;
} node[N];

Tip: 下标顺序不是单链表顺序

 

val 代表 元素本身,nxt 代表 连接的下一个元素 

 

2.2 插入元素的方法?

执行此操作的时间复杂度为 O(1)

在 链表 中插入元素

链表中的C 的指向为 链表中的A 的原来的指向(也就是B)

链表中的A 的指向变为 C

node[C].nxt = node[A].nxt;
node[A].nxt = C;

 

在 链表 开头插入元素

 

node[B].nxt = A;

 

在 链表 末尾插入元素

 

链表 中,末尾元素中的 nxt 始终保持 -1 的状态, 所以在 末尾 插入元素时, 插入元素 的 nxt 要 赋值 原末尾 nxt 值

node[B].nxt = node[A].nxt;
node[A].nxt = B;

 

2.3 删除元素的方法?

在 链表 中删除中间元素

让 A 的 nxt 直接指向 C

node[A].nxt = C;

在 链表 中删除队头元素

直接 pass 掉,不调用 队头 即可

在 链表 中删除队尾元素

将原来队尾的 nxt 的值 赋值 到 前一个的 nxt 值 里面

node[A].nxt = node[B].nxt;

 

3. 引例

Tip: 如果你想自己将这题独立完成做一遍,请自行到文章最底部进行传送

 

实现一个数据结构,维护一张表(最初只有一个元素 1)。需要支持下面的操作,其中 x 和 y 都是 1 到 106 范围内的正整数,且保证任何时间表中所有数字均不相同,操作数量不多于 105

1 x y :将元素 y 插入到 x 后面;

2 x :询问 x 后面的元素是什么。如果 x 是最后一个元素,则输出 0

3 x:从表中删除元素 xxx后面的那个元素,不改变其他元素的先后顺序。

输入格式

第一行一个整数 q 表示操作次数。

接下来 q 行,每行表示一次操作,操作具体间题目描述。

输出格式

对于每个操作 2输出一个数字,用换行隔开

 

4. 正题

定义相关变量 q (操作次数),operation(进行的操作), xy。并且需要一个 结构体 来储存 链表节点

const int N = 2e6;
int q, operation, x, y;
struct Node() {int nxt; // 此程序不需要 val 值
} node[N];

题目告知最初的表有一个 元素 1 在维护,所以我们对它进行 预处理

node[1].nxt = -1;

当 operation 的值为 1 时,将 y 插入在 x 的后面,所以排除直接开头插入元素时的代码,只用处理好 中间末尾 的插入即可

if (operation == 1) {cin >> x >> y;node[y].nxt = node[x].nxt; // 将原来 x 的 nxt 给到 y 的 nxtnode[x].nxt = y; // x 的 nxt 变为 y
}

当 operation 的值为 2 时, 输出 x 后面的元素(即 node[x].nxt

if (operation == 2) {cin >> x;cout << node[x].nxt << endl;
}

当 operation 的值为 3 时, 删除 x 后面的元素(即 node[x].nxt

if (operation == 2) {cin >> x;node[x].nxt = node[node[x].nxt].nxt; // 相当于套娃,即 x 的下一个元素 为 x 的下一个元素 的下一个元素
}

最终代码

#include <bits/stdc++.h>
using namespace std;
const int N = 2e6;
int q, operation, x, y;
struct Node {int  nxt;
} node[N];
signed main() {cin >> q;node[1].nxt = -1;for (int i = 1; i <= q; ++i) {cin >> operation;if (operation == 1) {cin >> x >> y;node[y].nxt = node[x].nxt;node[x].nxt = y;}else if (operation == 2) {cin >> x;if (node[x].nxt == -1) {cout << 0 << endl;continue;}cout << node[x].nxt << endl;}else if (operation == 3) {cin >> x;node[x].nxt = node[node[x].nxt].nxt;}}}

相关练习

洛谷 B3631:传送门

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

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

相关文章

WPF 模拟UWP原生窗口样式——亚克力|云母材质、自定义标题栏样式、原生DWM动画 (附我封装好的类)

先看一下最终效果,左图为使用亚克力材质并添加组合颜色的效果;右图为MicaAlt材质的效果。两者都自定义了标题栏并且最大限度地保留了DWM提供的原生窗口效果(最大化最小化、关闭出现的动画、窗口阴影、拖拽布局器等)。接下来把各部分的实现一个个拆开来讲讲。 一、使用窗口材…

Redis学习(一)

1.通用命令keys * del k1 exists k1 expipe k1 ttl k12.String类型String类型的常见命令 set k1 v1 添加键值对 get k1 v1 获得键值对对应的值 mset k1 v1 k2 v2 一次性设置多个值 mget k1 k2 k3 一次性获取多个键值对的值 incr k1 让k1自增 incrby k1 2 按步长2自增 dec…

C# WebSocket Fleck 源码解读

最近在维护公司旧项目,偶然发现使用Fleck实现的WebSocket主动推送功能,(由于前端页面关闭时WebSocket Server中执行了多次OnClone事件回调并且打印了大量的关闭日志,),后来我特地看了源码,这里做一些分享 github: https://github.com/statianzo/Fleck在源码中,作者在 Sam…

SuperCLUE整理

参考信息: git:https://github.com/CLUEbenchmark/SuperCLUE 官网:https://www.cluebenchmarks.com/superclue.html 23年7月论文 :https://arxiv.org/pdf/2307.15020: 24年4月报告:https://www.cluebenchmarks.com/superclue_2404 24年7月报告:https://www.cluebenchmar…

20240819编译 链接 单片机执行的第一个语句

2024年8月中旬在宝鸡出差,在B站上学习了下。 在linux操作系统中,gdb是调试器,gcc是编译器。 Linux 操作系统 将main.elf文件加载到内存中以后,操作系统为其分配进程,然后main函数就开始执行了。输入 layout asm 则显示出来汇编代码 键入 “starti”的时候 进入到程序里面的…

回溯part02

今天继续学习了回溯:组合求和的进阶 元素可以重复使用:backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数 数组去重:首先数组排序,然后使用used 分割回文子串问题,抽象为组合问题,注意如何判断是否是回文子串5. 39 组合总和(元素可重复…

2.系统定时器

系统定时器SYSTEM文件夹介绍1,sys文件夹介绍sys_nvic_set_vector_table():设置中断向量表地址sys_intx_enable():开启所有中断sys_intx_disable():关闭所有中断(但是不包括fault和NMI中断)sys_wfi_set():执行: WFI指令(执行完该指令进入低功耗状态)sys_standby():进入待机…

Terraform - 初解Terraform - 安装

开发环境配置 Note:安装环境为windows系统64位笔记本电脑 1.安装适用于 Windows 的 Terraform: https://developer.hashicorp.com/terraform/install 2.下载 Terraform: https://releases.hashicorp.com/terraform/1.9.4/terraform_1.9.4_windows_amd64.zip 3.从下载中,将…

python 05-标准库:csv、json、sqlite3、datetime模块

csv模块import csv# data.csv不存在时,会现在当前目录下创建一个data.csv文件 with open("data.csv", "w", encoding=utf-8) as file:writer = csv.writer(file)writer.writerow(["trasanction_id", "product_id", "price_id&qu…

初识方法

1.方法是什么 1.java方法是语句的合集,放在一起执行一个功能。 2.方法包含于类或对象中 3.方法在程序中被创建,在其他地方被引用 2.方法的原则:原子性 一个方法只能完成一个功能 3.在main方法外计算 1.先在main外面书写一个加法方法2.再在main里面直接输出加法方法总览:

Terraform - 初解Terraform - 简介

前言 云计算 主要提供计算服务,例如服务器、存储、数据库、网络等等; 对于云服务,通常只需使用多少支付多少,从而帮助降低运营成本,使基础设施更有效地运行,并能根据业务需求的变化调整对服务的使用。公有云: 多租户面向个人或企业由第三方云服务商托管和运营。 私有云: …