827. 雙鏈表

實現一個雙鏈表,雙鏈表初始爲空,支持5種操做:java

(1) 在最左側插入一個數;ui

(2) 在最右側插入一個數;spa

(3) 將第k個插入的數刪除;code

(4) 在第k個插入的數左側插入一個數;xml

(5) 在第k個插入的數右側插入一個數blog

如今要對該鏈表進行M次操做,進行完全部操做後,從左到右輸出整個鏈表。it

注意:題目中第k個插入的數並非指當前鏈表的第k個數。例如操做過程當中一共插入了n個數,則按照插入的時間順序,這n個數依次爲:第1個插入的數,第2個插入的數,…第n個插入的數。io

輸入格式

第一行包含整數M,表示操做次數。table

接下來M行,每行包含一個操做命令,操做命令可能爲如下幾種:class

(1) 「L x」,表示在鏈表的最左端插入數x。

(2) 「R x」,表示在鏈表的最右端插入數x。

(3) 「D k」,表示將第k個插入的數刪除。

(4) 「IL k x」,表示在第k個插入的數左側插入一個數。

(5) 「IR k x」,表示在第k個插入的數右側插入一個數。

輸出格式

共一行,將整個鏈表從左到右輸出。

數據範圍

1M1000001≤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();
       }
}
相關文章
相關標籤/搜索