AcWing 827. 双链表——算法基础课题解

AcWing 827. 双链表

题目描述

实现一个双链表,双链表初始为空,支持 5 种操作:

  1. 在最左侧插入一个数;
  2. 在最右侧插入一个数;
  3. 将第 k 个插入的数删除;
  4. 在第 k 个插入的数左侧插入一个数;
  5. 在第 k 个插入的数右侧插入一个数

现在要对该链表进行 M 次操作,进行完所有操作后,从左到右输出整个链表。

注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,……第 n 个插入的数。

输入格式

第一行包含整数 M,表示操作次数。

接下来 M 行,每行包含一个操作命令,操作命令可能为以下几种:

  1. L x,表示在链表的最左端插入数 x。
  2. R x,表示在链表的最右端插入数 x。
  3. D k,表示将第 k 个插入的数删除。
  4. IL k x,表示在第 k 个插入的数左侧插入一个数。
  5. IR k x,表示在第 k 个插入的数右侧插入一个数。

输出格式

共一行,将整个链表从左到右输出。

数据范围

1≤M≤100000
所有操作保证合法。

输入样例

10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2

输出样例

8 7 7 3 2 9

C++

#include <iostream>using namespace std;const int N = 1e5 + 10;int current, value[N], l[N], r[N];void insert(int k, int x) {value[current] = x;l[current] = k, r[current] = r[k];l[r[k]] = current, r[k] = current++;
}void remove(int k) {r[l[k]] = r[k];l[r[k]] = l[k];
}int main() {int m;scanf("%d", &m);r[0] = 1, l[1] = 0;current = 2;while (m--) {char command[3];int k, x;scanf("%s", command);if (command[0] == 'L') {scanf("%d", &x);insert(0, x);} else if (command[0] == 'R') {scanf("%d", &x);insert(l[1], x);} else if (command[0] == 'D') {scanf("%d", &k);remove(k + 1);} else if (command[1] == 'L') {scanf("%d%d", &k, &x);insert(l[k + 1], x);} else {scanf("%d%d", &k, &x);insert(k + 1, x);}}for (int i = r[0]; i != 1; i = r[i]) printf("%d ", value[i]);return 0;
}
#include <iostream>using namespace std;const int N = 1e5 + 10;int current, value[N], l[N], r[N];void insert(int k, int x) {value[current] = x;l[current] = k, r[current] = r[k];l[r[k]] = current, r[k] = current++;
}void remove(int k) {r[l[k]] = r[k];l[r[k]] = l[k];
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int m;cin >> m;r[0] = 1, l[1] = 0;current = 2;while (m--) {string command;int k, x;cin >> command;if (command[0] == 'L') {cin >> x;insert(0, x);} else if (command[0] == 'R') {cin >> x;insert(l[1], x);} else if (command[0] == 'D') {cin >> k;remove(k + 1);} else if (command[1] == 'L') {cin >> k >> x;insert(l[k + 1], x);} else {cin >> k >> x;insert(k + 1, x);}}for (int i = r[0]; i != 1; i = r[i]) cout << value[i] << ' ';return 0;
}
#include <iostream>using namespace std;struct Node {int value;int left;int right;
};const int N = 1e5 + 10;
Node nodes[N];
int current;void insert(int k, int x) {nodes[current].value = x;nodes[current].left = k;nodes[current].right = nodes[k].right;nodes[nodes[k].right].left = current;nodes[k].right = current++;
}void remove(int k) {nodes[nodes[k].left].right = nodes[k].right;nodes[nodes[k].right].left = nodes[k].left;
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);int m;cin >> m;nodes[0].right = 1;nodes[1].left = 0;current = 2;while (m--) {string command;int k, x;cin >> command;if (command[0] == 'L') {cin >> x;insert(0, x);} else if (command[0] == 'R') {cin >> x;insert(nodes[1].left, x);} else if (command[0] == 'D') {cin >> k;remove(k + 1);} else if (command[1] == 'L') {cin >> k >> x;insert(nodes[k + 1].left, x);} else {cin >> k >> x;insert(k + 1, x);}}for (int i = nodes[0].right; i != 1; i = nodes[i].right) cout << nodes[i].value << ' ';return 0;
}

Go

package mainimport ("bufio""fmt""os""strconv""strings"
)const N = 1e5 + 10var (current intvalue   [N]intl       [N]intr       [N]int
)func insert(k, x int) {value[current] = xl[current] = kr[current] = r[k]l[r[k]] = currentr[k] = currentcurrent++
}func remove(k int) {r[l[k]] = r[k]l[r[k]] = l[k]
}func main() {reader := bufio.NewScanner(os.Stdin)writer := bufio.NewWriter(os.Stdout)defer writer.Flush()var m intfmt.Scanf("%d", &m)r[0] = 1l[1] = 0current = 2for i := 0; i < m; i++ {reader.Scan()line := reader.Text()parts := strings.Fields(line)command := parts[0]switch command {case "L":x, _ := strconv.Atoi(parts[1])insert(0, x)case "R":x, _ := strconv.Atoi(parts[1])insert(l[1], x)case "D":k, _ := strconv.Atoi(parts[1])remove(k + 1)case "IL":k, _ := strconv.Atoi(parts[1])x, _ := strconv.Atoi(parts[2])insert(l[k+1], x)case "IR":k, _ := strconv.Atoi(parts[1])x, _ := strconv.Atoi(parts[2])insert(k+1, x)}}for i := r[0]; i != 1; i = r[i] {fmt.Fprintf(writer, "%d ", value[i])}
}
package mainimport ("bufio""fmt""os""strconv""strings"
)type Node struct {value intleft  intright int
}const N = 1e5 + 10var (nodes   [N]Nodecurrent int
)func insert(k, x int) {nodes[current].value = xnodes[current].left = knodes[current].right = nodes[k].rightnodes[nodes[k].right].left = currentnodes[k].right = currentcurrent++
}func remove(k int) {nodes[nodes[k].left].right = nodes[k].rightnodes[nodes[k].right].left = nodes[k].left
}func main() {reader := bufio.NewScanner(os.Stdin)writer := bufio.NewWriter(os.Stdout)defer writer.Flush()var m intfmt.Scanf("%d", &m)nodes[0].right = 1nodes[1].left = 0current = 2for i := 0; i < m; i++ {reader.Scan()line := reader.Text()parts := strings.Fields(line)switch parts[0] {case "L":x, _ := strconv.Atoi(parts[1])insert(0, x)case "R":x, _ := strconv.Atoi(parts[1])insert(nodes[1].left, x)case "D":k, _ := strconv.Atoi(parts[1])remove(k + 1)case "IL":k, _ := strconv.Atoi(parts[1])x, _ := strconv.Atoi(parts[2])insert(nodes[k+1].left, x)case "IR":k, _ := strconv.Atoi(parts[1])x, _ := strconv.Atoi(parts[2])insert(k+1, x)}}for i := nodes[0].right; i != 1; i = nodes[i].right {fmt.Fprintf(writer, "%d ", nodes[i].value)}
}

模板

// e[]表示节点的值,l[]表示节点的左指针,r[]表示节点的右指针,idx表示当前用到了哪个节点
int e[N], l[N], r[N], idx;// 初始化
void init()
{//0是左端点,1是右端点r[0] = 1, l[1] = 0;idx = 2;
}// 在节点a的右边插入一个数x
void insert(int a, int x)
{e[idx] = x;l[idx] = a, r[idx] = r[a];l[r[a]] = idx, r[a] = idx ++ ;
}// 删除节点a
void remove(int a)
{l[r[a]] = l[a];r[l[a]] = r[a];
}

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

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

相关文章

【Github】直接引用Github仓库中的图片

用picgo能够上传图片、复制链接。 那如果我已经将图片通过其他方法上传到Github仓库中&#xff0c;难道还要上传一次&#xff1f; 不用&#xff01; 步骤 1.打开仓库中要访问的图片 2.复制此时浏览器链接: https://github.com/jaxhur/image/blob/main/image-2022082410480713…

Navicat连接远程服务器的MySQL(局域网)

Navicat如何连接远程服务器的MySQL_navicat远程连接mysql-CSDN博客 我的电脑上运行MySQL的服务器端 正好在我哥家&#xff0c;在他的电脑上安装Navicat 两台电脑连接他家的wifi&#xff0c;那么就是处在同一局域网中&#xff0c;把防火墙都关掉&#xff0c;可以互相ping通。…

elementUi中的el-table合计行添加点击事件

elementUi 文档中&#xff0c;合计行并没有点击事件&#xff0c;这里自己实现了合计行的点击事件。 created() {this.propertyList [{ property: order, label: 序号 },{ property: deptName, label: 单位名称 },{ property: contentPublishQuantity, label: 文章数量 },{ pro…

解锁WSL下Docker使用

简介&#xff1a;Windows Subsystem for Linux&#xff08;简称WSL&#xff09;是一个在Windows 10上能够运行原生Linux二进制可执行文件&#xff08;ELF格式&#xff09;的兼容层。正常情况下&#xff0c;WSL安装完成后直接使用docker会抛出以下报错&#xff1a; Cannot conn…

谷歌推广和seo留痕具体怎么操作?

留痕跟谷歌推广其实是一回事&#xff0c;你能在谷歌上留痕&#xff0c;其实就是推广了自己的信息&#xff0c;本质上留痕就是在各大网站留下自己的记录&#xff0c;这个记录可以是品牌信息&#xff0c;联系方式&#xff0c;看你想留下什么 如果要问自己怎么操作&#xff0c;正常…

微信公众号排名 SEO的5个策略

随着微信公众号在社交媒体领域的持续发展和普及&#xff0c;如何提升公众号的搜索排名&#xff0c;成为许多运营者关注的焦点。公众号排名SEO&#xff0c;即针对微信公众号进行搜索引擎优化&#xff0c;旨在提高公众号在搜索结果中的曝光率和点击率。下面&#xff0c;我们将深入…

数据库中虚拟表和临时表的区别?

虚拟表&#xff08;Virtual Table&#xff09;和临时表&#xff08;Temporary Table&#xff09;在数据库系统中都用于处理暂时性的数据存储需求&#xff0c;但它们的概念和用途有所不同&#xff1a; 虚拟表&#xff08;通常是视图View&#xff09;&#xff1a; 虚拟表&#…

银行电子凭证技术规范

银行电子凭证技术规范 1 范围 本文件规定了银行电子凭证的文件、数据与样式、系统逻辑框架、生成、通信传输和安全要求&#xff0c;以 及验证方法。 本文件适用于银行电子凭证数据实例与版式文件的开具、传输、接收和应用。 2 规范性引用文件 下列文件中的内容通过文中的规范…

如何复制本地docker镜像到其他主机

&#xff08;1&#xff09;打包镜像 比如我要复制的镜像是grafana的镜像 docker images 这里我把打包的镜像放在了根~目录下&#xff0c;如截图所示&#xff1a; docker save grafana/grafana:latest -o ~/grafana.jar &#xff08;2&#xff09;移动镜像 scp命令拷贝镜像到目标…

标贝数据采集标注在自动驾驶场景中落地应用实例

AI数据服务作为人工智能和机器学习的基础&#xff0c;在自动驾驶领域中有着重要地位。与其他人工智能应用场景相比&#xff0c;自动驾驶的落地场景相对复杂&#xff0c;想要让汽车本身的算法做到处理更多、更复杂的场景&#xff0c;就需要运用大量场景化高质量AI数据做支撑。标…

kafka日志存储

前言 kafka的主题(topic)可以对应多个分区(partition)&#xff0c;而每个分区(partition)可以有多个副本(replica)&#xff0c;我们提生产工单创建topic的时候也是要预设这些参数的。但是它究竟是如何存储的呢&#xff1f;我们在使用kafka发送消息时&#xff0c;实际表现是提交…

uniapp遍历数组对象的常见方法

在 UniApp 中&#xff0c;遍历数组对象的方法与在普通 JavaScript 中是相同的。UniApp 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;因此你可以使用 Vue.js 和 JavaScript 的语法来遍历数组对象。 以下是一些常见的遍历数组对象的方法&#xff1a; 使用 for 循环 …

解密MySQL之谜:为何B+树胜过跳表成为其首选索引结构?

在数据库系统中&#xff0c;索引是提高查询性能的关键因素之一。MySQL 作为最流行的关系型数据库管理系统之一&#xff0c;其底层存储引擎使用的索引结构主要是 B 树。 然而&#xff0c;跳表作为一种高效的数据结构&#xff0c;在某些情况下也能够提供较好的查询性能。 为什么…

tomcat-GC溢出

背景 一个项目需要导出大量的数据&#xff0c;导致GC但是这个项目在本地能够运行&#xff0c;但是在服务器上就不能运行本地和服务器的区别&#xff1a;NGINX和TOMCATGC和NGINX无关&#xff0c;那么就是Tomcat分配JVM的堆内存的容量不够 错误解决思路 网上教了一些查看JVM的大小…

分布式锁与秒杀

分布式锁与秒杀 1. 分布式锁1.1 常用Redis分布式锁方案三&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令) 秒杀 1. 分布式锁 https://www.cnblogs.com/shoshana-kong/p/17519673.html 1.1 常用Redis分布式锁方案三&#xff1a;使用Lua脚本(包含SETNX EXPIRE两条指令) …

sql注入基础-2

一、sqlmap工具(kali自带) 1、官网&#xff1a;http://www.sqlmap.org 2、版本查看 python sqlmap.py --version 3、常见命令&#xff1a; -h&#xff1a;查看帮助信息-u "URL" &#xff1a;指定网站-p 参数1,参数2&#xff1a;指定参数 注&#xff1a;-p 只能跟…

力扣141.环形链表142.环形链表Ⅱ 附证明

题目链接&#xff1a; 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 141.环形链表 方法思路&#xff1a;快慢指针 代码: class Solution { public:bool hasCycle(ListNode *head) {if(!head){return fa…

Nodejs内存管[Mark-Sweep算法][Mark-Compact]

内存控制 Mark-Sweep & Mark-Compact 对于老生代的对象&#xff0c;存活对象占较大的比重&#xff0c;采用scvenge方法会存在如下问题 1. 存活对象较多&#xff0c;复制存活对象的效率很低 2. 浪费一半空间的问题因此v8在老生代中主要采用了Mark-Sweep和Mark-Compact相结…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳&#xff1a; 1&#xff09;用1个小粒度的模式&#xff0c;逐个与图像的局部区域进行运算&#xff0c;运算结果反映模式与区域的匹配程度。 2&#xff09;卷积神经网络与全连接神经网络的区别&#xff1a; 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

【OceanBase诊断调优】—— Unit 迁移问题的排查方法

适用版本&#xff1a;V2.1.x、V2.2.x、V3.1.x、V3.2.x 本文主要介绍 OceanBase 数据集在副本迁移过程中遇到的问题的排查方法。 适用版本 V2.1.x、V2.2.x、V3.1.x、V3.2.x 手动调度迁移问题的排查 OceanBase 数据库的 RootService 模块负责 Unit 迁移的调度&#xff0c;如果…