zoukankan      html  css  js  c++  java
  • 827. 双链表

    实现一个双链表,双链表初始为空,支持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个插入的数右侧插入一个数。

    输出格式

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

    数据范围

    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();
           }
    }
  • 相关阅读:
    npm WARN saveError ENOENT: no such file or directory的解决方法
    简单的webpack打包案例
    JS中用encodeURIComponent编码,后台JAVA解码
    说 Redis
    let the cat out of the bag
    简述C# volatile 关键字
    螃蟹怎么分公母?是用冷水上锅还是热水蒸呢?
    Mysql截取字符串 更新字段的部分内容
    Ajax 获取数据attr后获取不到
    如何限制域名访问?白名单机制
  • 原文地址:https://www.cnblogs.com/qdu-lkc/p/12221538.html
Copyright © 2011-2022 走看看