
AcWing 827. 双链表
发布日期:2021-05-07 14:08:25
浏览次数:14
分类:原创文章
本文共 2286 字,大约阅读时间需要 7 分钟。
实现一个双链表,双链表初始为空,支持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≤1000001≤M≤100000
所有操作保证合法。
输入样例:
10R 7D 1L 3IL 2 10D 3IL 2 7L 8R 9IL 4 7IR 2 2
输出样例:
8 7 7 3 2 9
思想:0 1 位置存储首尾节点,然后扩展
/存储首尾节点,0<->1 头指向尾,尾指向头,作为前后哨兵,0->节点->节点->...->节点->1,遍历是从r[0]->1
import java.io.*;import java.lang.Integer;class Main{ static int N = 100010; static int[] e = new int[N] , l = new int[N] , r = new int[N]; static int idx; static void init(){//存储首尾节点,0<->1 头指向尾,尾指向头,作为前后哨兵,0->节点->节点->...->节点->1,遍历是从r[0]->1 r[0] = 1; l[1] = 0; idx = 2; } //插入k后 static void add(int k, int x){ e[idx] = x; r[idx] = r[k]; l[idx] = k; l[r[k]] = idx; r[k] = idx++; } //删除k后节点 static void remove(int k){ l[r[k]] = l[k]; r[l[k]] = r[k]; } public static void main(String[] args)throws Exception{ BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.valueOf(buf.readLine()); init(); while(n-- != 0){ String[] params = buf.readLine().split(" "); if("L".equals(params[0])){ int x = Integer.valueOf(params[1]); add(0, x); }else if("R".equals(params[0])){ int x = Integer.valueOf(params[1]); add(l[1], x); }else if("IL".equals(params[0])){ int k = Integer.valueOf(params[1]); int x = Integer.valueOf(params[2]); add(l[k + 1], x); }else if("IR".equals(params[0])){ int k = Integer.valueOf(params[1]); int x = Integer.valueOf(params[2]); add(k + 1, x); }else{ int k = Integer.valueOf(params[1]); remove(k + 1); } } for(int i = r[0]; i != 1; i = r[i]){//0是头结点,我们要的是头结点的下一个节点 System.out.printf("%d ", e[i]); } }}
发表评论
最新留言
不错!
[***.144.177.141]2025年04月05日 09时47分21秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
数组--Go语言学习笔记
2019-03-04
Redis (三)——Linux 上安装 Redis
2019-03-04
c编程常见错误-函数声明没有参数类型声明
2019-03-04
概率论 贝叶斯公式
2019-03-04
java 重写(override)和重载(overload)区别
2019-03-04
java 多态
2019-03-04
java 多态类型转换
2019-03-04
java ==和equals
2019-03-04
java 接口(Interface)多态特性
2019-03-04
搜集整理随机产生人的姓名的2种方法
2019-03-04
最简单的Socket程序[入门篇]
2019-03-04
VS2005图标默认存放位置
2019-03-04
常用正则表达式
2019-03-04
C#中换行的代码
2019-03-04
用正则表达式过滤多余空格
2019-03-04
XML:采用XHTML和CSS设计可重用可换肤的WEB站点
2019-03-04
【springmvc】传值的几种方式&&postman接口测试
2019-03-04
泳道图简介
2019-03-04
Tomcat6中web项目部署路径webapps和wtpwebapps的区别
2019-03-04
Java判断字符串是否为金额
2019-03-04