当前位置: 首页 > news >正文

题解:AcWing 827 双链表

【题目来源】

AcWing:827. 双链表 - AcWing题库

【题目描述】

实现一个双链表,双链表初始为空,支持 \(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\) 个插入的数右侧插入一个数。

【输出】

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

【输入样例】

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

【解题思路】

image

【算法标签】

《AcWing 827 双链表》 #链表#

【代码详解】

#include <bits/stdc++.h>
using namespace std;const int N = 100010;  // 定义链表最大容量// 全局变量定义
int m;        // 操作次数
int e[N];     // e[i]存储节点i的值
int l[N];     // l[i]存储节点i的左节点下标
int r[N];     // r[i]存储节点i的右节点下标
int idx;      // 当前可用节点索引/*** 初始化双链表* 使用0作为左哨兵节点,1作为右哨兵节点*/
void init() 
{// 初始化哨兵节点r[0] = 1;    // 左哨兵的右节点是右哨兵l[1] = 0;    // 右哨兵的左节点是左哨兵idx = 2;     // 已使用0和1两个哨兵节点
}/*** 在节点k的右侧插入值为x的节点* @param k 基准节点下标* @param x 要插入的值*/
void add(int k, int x) 
{e[idx] = x;      // 存储节点值r[idx] = r[k];   // 新节点的右指针指向k的右节点l[idx] = k;      // 新节点的左指针指向kl[r[k]] = idx;   // k的原右节点的左指针指向新节点r[k] = idx;      // k的右指针指向新节点idx++;           // 分配下一个可用节点
}/*** 删除指定节点* @param k 要删除的节点下标*/
void remove(int k) 
{r[l[k]] = r[k];  // 左节点的右指针指向右节点l[r[k]] = l[k];  // 右节点的左指针指向左节点
}int main()
{cin >> m;  // 输入操作次数init();    // 初始化双链表while (m--) {string s;  // 操作类型int k, x;  // 操作参数cin >> s;if (s == "L") {// 在链表最左端插入cin >> x;add(0, x);  // 在左哨兵右侧插入} else if (s == "R") {// 在链表最右端插入cin >> x;add(l[1], x);  // 在右哨兵的左侧节点右侧插入} else if (s == "D") {// 删除第k个插入的节点cin >> k;remove(k + 1);  // 调整索引(哨兵节点占用了0和1)} else if (s == "IL") {// 在第k个插入的节点左侧插入cin >> k >> x;add(l[k + 1], x);  // 相当于在k节点的前驱节点右侧插入} else {// 在第k个插入的节点右侧插入cin >> k >> x;add(k + 1, x);  // 直接插入到k节点右侧}}// 遍历输出链表(从左哨兵到右哨兵)for (int i = r[0]; i != 1; i = r[i]) {cout << e[i] << " ";}cout << endl;return 0;
}

【运行结果】

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 
http://www.jsqmd.com/news/399259/

相关文章:

  • 题解:AcWing 826 单链表
  • 题解:AcWing 802 区间和
  • js获取html相邻标签
  • 题解:AcWing 803 区间合并
  • 计算机毕业设计 | SpringBoot+vue科研项目验收管理系统(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue毕业论文管理系统 高校文档项目答辩平台(附源码+论文)
  • 计算机毕业设计 | SpringBoot+vue中山社区医疗综合服务平台(附源码+论文)
  • Flink 任务失败恢复机制Restart Strategy 和 Failover Strategy 怎么配才“又稳又不炸”
  • Tauri 前端配置把任何前端框架“正确地”接进 Tauri(含 Vite/Next/Nuxt/Qwik/SvelteKit/Leptos/Trunk)
  • 计算机毕业设计 | SpringBoot+vue毕业设计答辩平台 校园成绩管理系统(附源码+论文)
  • Tauri 项目结构前端壳 + Rust 内核,怎么协作、怎么构建、怎么扩展
  • 抖音评论自动采集|拓客|免登录
  • 当Claude Code负责人说amp;quot;编程已解决amp;quot;,测试工程师该慌吗?
  • Claude Code 安装教程(macOS / Linux / Windows PowerShell 一键脚本)【2026 最新】
  • 题解:AcWing 801 二进制中1的个数
  • 寒假第二十天
  • 一文彻底搞懂强化学习
  • js XMLHttpRequest编程误区(复用这个对象导致的冲突问题)
  • 当Claude Code负责人说编程已解决,测试工程师该慌吗?
  • vue+springboot线上学生作业批改考试系统_6li288nu
  • pythonQT图书管理系统的进阶版本
  • vue+springboot基于线性回归的音乐推荐系统 爬虫 数据分析可视化大屏5
  • 一天一个Python库:httpcore - 异步HTTP核心库
  • vue+springboot基于聚类算法的美妆产品网络评价系统的化妆品爬虫数据采集与可视化分析系统
  • JAVA虚拟机-JVM
  • vue+springboot甜点蛋糕商城系统 团子烘焙销售服务系统
  • vue+springboot基于ai技术的学习资料分享平台
  • vue+springboot基于BS的中小企业商品进销存管理系统 数据分析可视化大屏系统 i59u2562
  • vue+springboot企业合同管理系统设计与实现 5c062cu7
  • vue+springboot城市供水管网爆管预警系统