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

(1) 在最左侧插入一个数;

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

(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个插入的数右侧插入一个数。

输出格式

共一行,将整个链表从左到右输出。

数据范围

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

827. 双链表 算法 第1张

 

          删除操作: 删除第k个点,r[l[k]]=r[k],l[r[k]]=l[k]

        827. 双链表 算法 第2张

 

        插入操作:在下标为k的右边插入一个数;左边插入一个数相当于在l[k]的右边插入一个数

        r[idx]=r[k]; l[idx]=k; l[r[k]]=idx; r[k]=idx;

      827. 双链表 算法 第3张

 

 

     代码:
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();
       }
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄