# 2、数组模拟双链表

# AcWing 827. 双链表

import java.util.*;

//ACWing
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.danlianbiao();
    }

    int N = 100010;
    int idx;
    int e[] = new int[N];
    int l[] = new int[N];
    int r[] = new int[N];

    //在a号点的的右结点插入一个数
    void insert(int a, int x) {
        e[idx] = x;
        l[idx] = a;
        r[idx] = r[a];
        l[r[a]] = idx;
        r[a] = idx++;
    }

    //删除结点a
    void remove(int a) {
        r[l[a]] = r[a];
        l[r[a]] = l[a];
    }

    void danlianbiao() {
        //100000的右节点是100001
        //100001的左节点是100000
        //其他所有点都建立在100000-100001的基础上
        //完成以上步骤后,设定初始idx为0
        r[100000]=100001;
        l[100001]=100000;
        idx=0;
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            String d = scanner.next();
            if (d.equals("L")) {
                int k = scanner.nextInt();
                insert(100000, k);
            }
            if (d.equals("R")) {
                int k = scanner.nextInt();
                insert(l[100001], k);
            }
            if (d.equals("D")) {
                int k = scanner.nextInt();
                remove(k-1);
            }
            if (d.equals("IL")) {
                int k = scanner.nextInt();
                int x = scanner.nextInt();
                insert(l[k-1],x);
            }
            if (d.equals("IR")) {
                int k = scanner.nextInt();
                int x = scanner.nextInt();
                insert(k-1,x);
            }
        }

        for(int i=r[100000];i!=100001;i=r[i]){
            System.out.print(e[i]+" ");
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

# 另一种按照0-1为分界的写法,idx开始设为2

import java.util.*;

//ACWing
public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        main.danlianbiao();
    }

    int N = 100010;
    int idx;
    int e[] = new int[N];
    int l[] = new int[N];
    int r[] = new int[N];

    //在a号点的的右结点插入一个数
    void insert(int a, int x) {
        e[idx] = x;
        l[idx] = a;
        r[idx] = r[a];
        l[r[a]] = idx;
        r[a] = idx++;
    }

    //删除结点a
    void remove(int a) {
        r[l[a]] = r[a];
        l[r[a]] = l[a];
    }

    void danlianbiao() {
        //0的右节点是1
        //1的左节点是0
        //其他所有点都建立在0-1的基础上
        //完成以上步骤后,设定初始idx为2
        r[0]=1;
        l[1]=0;
        idx=2;
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = 0; i < n; i++) {
            String d = scanner.next();
            if (d.equals("L")) {
                int k = scanner.nextInt();
                insert(0, k);
            }
            if (d.equals("R")) {
                int k = scanner.nextInt();
                insert(l[1], k);
            }
            if (d.equals("D")) {
                int k = scanner.nextInt();
                remove(k+1);
            }
            if (d.equals("IL")) {
                int k = scanner.nextInt();
                int x = scanner.nextInt();
                insert(l[k+1],x);
            }
            if (d.equals("IR")) {
                int k = scanner.nextInt();
                int x = scanner.nextInt();
                insert(k+1,x);
            }
        }

        for(int i=r[0];i!=1;i=r[i]){
            System.out.print(e[i]+" ");
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71