实现一个双链表,双链表初始为空,支持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
所有操作保证合法。
输入样例:
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
思路:双链表初始化,r[0]=1,l[1]=0
删除操作: 删除第k个点,r[l[k]]=r[k],l[r[k]]=l[k]
插入操作:在下标为k的右边插入一个数;左边插入一个数相当于在l[k]的右边插入一个数
r[idx]=r[k]; l[idx]=k; l[r[k]]=idx; r[k]=idx;
代码:
import java.util.Scanner; public class Main{ static final int max=(int)1e5+5; static int e[]=new int[max]; static int l[]=new int[max]; static int r[]=new int[max]; static int idx; static void init(){ r[0]=1; l[1]=0; idx=2; } //在下标为k的结点后边插入一个数x static void add(int k,int x){ e[idx]=x; r[idx]=r[k]; l[idx]=k; l[r[k]]=idx; r[k]=idx; idx++;//idx别忘了++ } static void del(int k){ r[l[k]]=r[k]; l[r[k]]=l[k]; } public static void main(String[] args) { Scanner scan=new Scanner(System.in); int m=scan.nextInt(); init();//一定要初始化 while(m-->0){ String op=scan.next(); if(op.equals("L")){ int x=scan.nextInt(); add(0,x); } else if(op.equals("R")){ int x=scan.nextInt(); add(l[1],x); } else if(op.equals("D")){ int k=scan.nextInt(); del(k+1);//k+1的原因是idx下标初始为2 } else if(op.equals("IL")){ int k=scan.nextInt(); int x=scan.nextInt(); add(l[k+1],x); } else if(op.equals("IR")){ int k=scan.nextInt(); int x=scan.nextInt(); add(k+1,x); } } for(int i=r[0];i!=1;i=r[i]) //输出从r[0] System.out.print(e[i]+" "); System.out.println(); } }