實作一個雙鏈表,雙鏈表初始為空,支持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(); } }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/103936.html
標籤:其他
上一篇:Socket傳輸問題
下一篇:829. 模擬佇列
