Acwing---827.双链表

双链表

  • 1.题目
  • 2.基本思想
  • 3.代码实现

1.题目

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

  1. 在最左侧插入一个数;
  2. 在最右侧插入一个数;
  3. 将第 k k k 个插入的数删除;
  4. 在第 k k k个插入的数左侧插入一个数;
  5. 在第 k k k个插入的数右侧插入一个数
    现在要对该链表进行 M M M 次操作,进行完所有操作后,从左到右输出整个链表。

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

输入格式
第一行包含整数 M M M,表示操作次数。

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

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

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

数据范围
1 ≤ M ≤ 100000 1≤M≤100000 1M100000

所有操作保证合法。 所有操作保证合法。 所有操作保证合法。

输入样例:

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

2.基本思想

在这里插入图片描述

3.代码实现

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {static int N = 100010;static int[] e = new int[N], l = new int[N], r = new int[N];static int  idx;private static void init() {l[1] = 0;r[0] = 1;//* 初始化 第一个点的右边是 1   第二个点的左边是 0idx = 2;//此时 已经用掉2个点了}//向第k个数字右边插入一个值 valprivate static void add(int k, int val) {e[idx] = val;r[idx] = r[k];l[idx] = k;l[r[k]] = idx;r[k] = idx++;}private static void remover(int k) {//元素是从下标为2的位置开始加入,所以你第k个插入的元素,比如是第3个插入的元素,它的下标对应4,即:K+1r[l[k]] = r[k];l[r[k]] = l[k];}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int m = Integer.parseInt(br.readLine());init();while (m-- > 0) {String[] s = br.readLine().split(" ");String opt = s[0];// 0和 1 只是代表 头和尾  所以   最右边插入 只要在  指向 1的 那个点的右边插入就可以了if (opt.equals("L")) {//  最左边插入就是 在指向 0的数的左边插入就可以了   也就是可以直接在 0的 有右边插入int val = Integer.parseInt(s[1]);add(0, val);} else if (opt.equals("R")) {int val = Integer.parseInt(s[1]);add(l[1], val);} else if (opt.equals("D")) {int k = Integer.parseInt(s[1]);remover(k+1);} else if (opt.equals("IL")) {int k = Integer.parseInt(s[1]);int val = Integer.parseInt(s[2]);add(l[k+1], val);} else {int k = Integer.parseInt(s[1]);int val = Integer.parseInt(s[2]);add(k+1, val);}}//输出for (int i = r[0]; i != 1; i = r[i]) System.out.print(e[i]+" ");}
}

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

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

相关文章

安装Canal

安装和配置Canal 下面我们就开启mysql的主从同步机制,让Canal来模拟salve 1.开启MySQL主从 Canal是基于MySQL的主从同步功能,因此必须先开启MySQL的主从功能才可以。 这里以之前用Docker运行的mysql为例: 1.1.开启binlog 打开mysql容器…

景联文科技受邀出席全国信标委生物特征识别分委会二届五次全会

全国信息技术标准化技术委员会生物特征识别分技术委员会(SAC/TC28/SC37,以下简称“分委会”)二届五次全会于2024年1月30日在北京顺利召开,会议由分委员秘书长王文峰主持。 分委会由国家标准化管理委员会批准成立,主要负…

社交平台内容创作未来会有哪些方向?

内容为王的时代下,企业如果想要通过社交平台占据用户心智,可以找到适合自己的内容营销策略,好的内容能够与消费者建立信任关系,今天 媒介盒子就来和大家聊聊:社交平台内容创作的方向。 一、 内容逐渐细分 相比于原来…

WorkPlus打造个性化移动门户,实现协作创新与工作高效

在移动办公逐渐成为企业工作方式的主流趋势下,构建高效的移动门户平台对于提升信息传递与团队协作效能至关重要。移动门户作为企业信息交流和协作的重要枢纽,WorkPlus以其领先的功能和卓越的性能,助力企业实现智能移动门户平台的搭建。 为何…

在WORD中设置公式居中编号右对齐设置方式

1 软件环境 Office Microsoft Office LTSC 专业增强版2021 2 最终效果 3 操作步骤 编辑公式;光标定位到公式的最后(不是行的最后);输入#编号光标定位在公式最后(不是行的最后),按Enter键回车…

Iptables 和 Netfilter 架构深入解析

介绍 防火墙是一种重要的工具,可以配置来保护您的服务器和基础设施。在 Linux 生态系统中,iptables 是一个广泛使用的防火墙工具,它与内核的 netfilter 数据包过滤框架配合工作。由于复杂的语法和涉及的相关部分数量众多,创建可靠…

R3 下动态加载的模块的保护(一)

前言 在 R3 下防护动态加载的模块不被意外卸载需要很多的策略,比如:LDR 断链、VAD 记录擦除、PE 头擦除、修改入口函数、内存注入等。文本我们将浅析模块静态化技术这一项技术。模块静态化是一个很常见的模块保护技术,它通过修改模块的引用计…

建筑工程答案在哪搜?九个免费好用的大学生搜题工具 #经验分享#知识分享

大学生必备,这条笔记大数据一定定要推给刚上大学的学弟学妹!! 1.七燕搜题 这是一个公众号 解题步骤详细解析,帮助你理解问题本质。其他考试领域也能找到答案。 下方附上一些测试的试题及答案 1、据《素问太阴阳明论》所论&…

Docker 常用命令详细介绍

Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 使用概率最高的命令…

爬取58二手房并用SVR模型拟合

目录 一、前言 二、爬虫与数据处理 三、模型 一、前言 爬取数据仅用于练习和学习。本文运用二手房规格sepc(如3室2厅1卫)和二手房面积area预测二手房价格price,只是练习和学习,不代表如何实际意义。 二、爬虫与数据处理 import requests import cha…

关于Clone

关于Clone 一般情况下,如果使用clone()方法,则需满足以下条件。 1、对任何对象o,都有o.clone() ! o。换言之,克隆对象与原型对象不是同一个对象。 2、对任何对象o,都有o.clone().getClass() o.getClass()。换言之&a…

背景样式de七七八八

一,简介 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 1.1背景颜色(background-color) background-color:transparent/color; 默认值为transparent(透明的&#xff…

踩坑日记-Feign通过get请求报错 method get must not have a request body

Feign通过get方式请求,请求体中带RequestBody 一、 添加pom <dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId><version>10.10.1</version> </dependency> 二、配置开启 feign…

Rust 第一个rust程序Hello Rust️

文章目录 前言一、vscode 安装rust相关插件二、Cargo New三、vscode调试rustLLDB 前言 Rust学习系列。今天就让我们掌握第一个rust程序。Hello Rust &#x1f980;️。 在上一篇文章我们在macOS成功安装了rust。 一、vscode 安装rust相关插件 以下是一些常用的 Rust 开发插件…

circuitjs仿真电路原理探索

circuitjs是开源的电源仿真软件 ,使用Java开发的,不过使用GWT包装的,GWT是一个可以将Java代码编译成js的开源项目,所以和普通的Java项目还是有区别的。 circuitjs是基于改进节点分析(MNA)算法实现的,这里主要讲一下circuitjs的核心算法流程,有以下关键步骤: updateC…

从传统到现代:易点易动固定资产管理系统利用RFID技术高效管理固定资产

近年来,随着RFID技术的发展与成熟,它被越来越多地应用于企业资产管理领域。易点易动推出的固定资产管理系统就将RFID技术深度整合,实现了企业固定资产管理模式的跨越式变革。 传统管理模式的不足 传统的手工登记式管理模式在企业固定资产管理中存在很多问题: 信息录入缺乏规范…

幻兽帕鲁服务器自动重启备份-python

幻兽帕鲁服务器自动重启备份-python 1. 前置知识点2. 目录结构3. 代码内容4. 原理解释5. 额外备注 基于python编写的服务器全自动管理工具&#xff0c;能够实现自动定时备份存档&#xff0c;以及在检测到服务器崩溃之后自动重新启动&#xff0c;并且整合了对于frp端口转发工具的…

c语言:贪吃蛇的实现

目录 贪吃蛇实现的技术前提&#xff1a; Win32 API介绍 控制台程序&#xff08;console&#xff09; 控制台屏幕上的坐标 GetStdHandle GetConsoleCursorInfo CONSOLE_CURSOR_INFO SetConsoleCursorInfo SetConsoleCursorPosition GetAsyncKeyState 宽字符的打印 …

进程中线程使用率偏高问题排查

1. top命令查看CPU使用率高的进程 2. top -H -p 15931(进程PID) 查看进程下的线程 3. printf "%x\n" 17503(线程PID) 线程PID 10进制转16进制 0x445f 4. jstack -l 15931(JVM进程PID) 导出java进程栈信息&#xff0c;里面包含线程nid0x445f和所在的类&#xff0…

【AG32VF407】国产MCU+FPGA Verilog双边沿检测输出方波

视频讲解 [AG32VF407]国产MCUFPGA Verilog双边沿检测输出方波 实验过程 本次使用使用AG32VF407开发板中的FPGA&#xff0c;使用双clk的双边沿进行检测&#xff0c;同步输出方波 同时可以根据输出的方波检测clk的频率&#xff0c;以及双clk的相位关系&#xff0c;如下为verilog…