数据结构之双链表(数组模拟)(Java)

	import java.util.*;

class Main {
    
    
    static int[] e = new int[100010];
    static int[] l = new int[100010];
    static int[] r = new int[100010];
    static int idx;
    
    static Scanner in = new Scanner(System.in);
    
    // 0:左端点 1:右端点
    static void init(){
    
    
        r[0] = 1;
        l[1] = 0;
        idx = 2;
    }
    
    // 只要实现,在第k个插入的数右边插入的函数,其他的插入就可以借用这个函数了。
    static void insert(int k, int x) {
    
    
        e[idx] = x;
        r[idx] = r[k];
        l[idx] = k;
        // 以下两句顺序不能颠倒,在修改r[k]之前,使用r[k]
        l[r[k]] = idx;
        r[k] = idx ++ ;
    }
    
    // 删除第k个插入的数
    static void delete(int k) {
    
    
        // 第k个插入的数的右边的节点的左指针 -> 第k个插入的数的左边的节点
        l[r[k]] = l[k];
        // 第k个插入的数的左边的节点的右指针 -> 第k个插入的数的右边的节点
        r[l[k]] = r[k];
    }
    
    public static void main(String[] args) {
    
    
        init();
        int m  = in.nextInt();

        while (m -- > 0) {
    
    
            String str = in.next();
            int k;
            int x;
            if (str.equals("IL")) {
    
    
                k = in.nextInt();
                x = in.nextInt();
                insert(l[k + 1], x);// 区别于单链表 k + 1(因为idx初始为2)
            } else if (str.equals("IR")) {
    
    
                k = in.nextInt();
                x = in.nextInt();
                insert(k + 1, x);
            } else if (str.equals("L")) {
    
    
                x = in.nextInt();
                insert(0, x);
            } else if (str.equals("R")) {
    
    
                x = in.nextInt();
                insert(l[1], x);
            } else {
    
    
                k = in.nextInt();
                delete(k + 1);
            }
        }
        // 循环遍历,输出数值
        for (int i = r[0]; i != 1; i = r[i]) {
    
    
            System.out.print(e[i] + " ");
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Sherlook_Holmes/article/details/121848006