第二题:数组模拟双链表

news/2024/11/22 14:26:25/

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

  1. 在最左侧插入一个数;

  2. 在最右侧插入一个数;

  3. 将第 k 个插入的数删除;

  4. 在第 k 个插入的数左侧插入一个数;

  5. 在第 k 个插入的数右侧插入一个数

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

注意:题目中第 kk 个插入的数并不是指当前链表的第 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≤1000001≤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

代码:

import java.util.*;
import java.io.*;public class Main{private static int N = 100010;private static int e[] = new int[N];private static int l[] = new int[N];private static int r[] = new int[N];private static int idx;//初始化第1个插入节点下标为2,所以操作第k个数时都要+1 !!public static void init(){//左右边界指针,非节点r[0] = 1;  //指向第一个节点l[1] = 0;  //指向最后一个节点idx = 2;}public static void insertL(int x){e[idx] = x;r[idx] = r[0];l[idx] = 0;     //这个可不指,但反向遍历就需要,所以最好也指l[r[0]] = idx;r[0] = idx++;}//在右边界前插入时,新节点的右指针也要指向边界,否则无法遍历到边界(超时)!!public static void insertR(int x){e[idx] = x;l[idx] = l[1];r[idx] = 1;    //这个要指!!r[l[1]] = idx;l[1] = idx++;}public static void delete(int k){r[l[k]] = r[k];l[r[k]] = l[k];}public static void insertK(int k,int x){e[idx] = x;l[idx] = k;r[idx] = r[k];l[r[k]] = idx;r[k] = idx++;}public static void main(String[] args) throws IOException{init();BufferedReader br = new BufferedReader(new InputStreamReader(System.in));int m = Integer.parseInt(br.readLine());while(m-- > 0){String[] ops = br.readLine().split(" ");if("L".equals(ops[0])){int x = Integer.parseInt(ops[1]);insertL(x);}else if("R".equals(ops[0])){int x = Integer.parseInt(ops[1]);insertR(x);}else if("D".equals(ops[0])){int k = Integer.parseInt(ops[1]);delete(k + 1);}else if("IL".equals(ops[0])){int k = Integer.parseInt(ops[1]);int x = Integer.parseInt(ops[2]);insertK(l[k + 1],x);}else if("IR".equals(ops[0])){int k = Integer.parseInt(ops[1]);int x = Integer.parseInt(ops[2]);insertK(k + 1,x);}}for(int i = r[0];i != 1;i = r[i]){System.out.print(e[i] +" ");}}
}


http://www.ppmy.cn/news/21117.html

相关文章

ZedGraph如何显示鼠标附近的曲线的点?介绍三种方法

使用ZedGraph绘制曲线图的时候,不仅仅是看曲线的走向,也需要查看曲线上某位位置处采集到的数据是多少。下面介绍三种方法,从简单到复杂。 文章目录1、使用自带的功能显示点的坐标2、 多条曲线的坐标点同时显示3、 多条曲线的坐标点同时显示&a…

令人窒息的百度面试题(正值换工作季,还不收藏???)

最近去网上找了一些百度的面经,冥冥之中在众多的面试题中打开了下边两个面试题: 2021百度前端社招面经 百度前端面试题分享,带答案 看完之后我直呼“哇哦~”,全部在我的射程范围之内。我该不会如此幸运到问的全会吧。 是的&am…

Leetcode刷题Day38-------------------动态规划

Leetcode刷题Day38-------------------动态规划 1. 理论基础 文章链接:https://programmercarl.com/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频链接:https://www.bilibili.com/video/BV13Q4y197Wg题目链接&a…

【Spring】高并发下如何提高“锁”性能?

高并发下如何提高“锁”性能?前言减小锁持有时间减小锁粒度读写分离锁来替换独占锁锁分离锁粗化总结前言 在项目中,尤其是电商或者做游戏开发的,高并发是必然的,但在高并发的环境下,大家会经常使用到 锁 。 “锁” 是…

数据库管理-第五十五期 DBA(20230131)

数据库管理 2023-01-32第五十五期 DBA1 数据库管理员2 数据库3 云数据库4 “列强是我自己”?总结第五十五期 DBA 这两天在DBA圈子里有几篇文章比较火,《你怎么还在招聘DBA?》,《云数据库是不是智商税?》,《你怎么不招…

PyQt5编程基础 2.1 GUI程序的基本框架

文章目录 创建纯代码GUI程序 创建目录 新建程序 创建GUI程序的基本过程(代码分析) 导入模块 创建应用程序 创建窗体 使用窗体类的GUI程序框架 创建项目目录 窗体设计 修改窗体的windowTitle 放一个label 放一个Push Button 保存窗体 代码设计 将QtApp中的ui文…

图例legend语法及设置

(1)设置图例位置 使用loc参数 plt.legend(loc‘lower left’) 0‘best’1‘upper right’2‘upper left’3‘lower left’4‘lower right’5‘right’6‘center left’7‘center right’8‘lower center’9‘upper center’10‘center’ (2)设置图例字体 #设置字体大小 fontsi…

如果把小程序业务和研发管理都放到一个平台

伴随着互联网在中国进程的发展,线上研发效能及业务应用软件也不落后于时代进步的脚步,中国软件行业从未停止过持续的创新。 2022年,业务应用开发正在简化,研发效能也在提升,其中不得不提软件在协同促进、研发一体化管…