- 这里主要用数组来模拟链表,也叫静态链表
- 偷个懒,把head存入数组0索引中,和单链表优化版一样
模板


- 注意,这里面的k + 1代表第k个插入的元素,因为idx是从k开始的
- C++
int e[N], l[N], r[N], idx;
void init()
{
r[0] = 1, l[1] = 0;
idx = 2;
}
void insert(int k, int x)
{
e[idx] = x;
l[idx] = k, r[idx] = r[k];
l[r[k]] = idx, r[k] = idx ++ ;
}
void remove(int k)
{
l[r[k]] = l[k];
r[l[k]] = r[k];
}
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';
for (int i = l[1]; i != 0; i = l[i]) cout << e[i] << ' ';
public static int[N] e = new int[];
public static int[N] l = new int[];
public static int[N] r = new int[];
public static int idx;
public static void init() {
r[0] = 1;
l[1] = 0;
idx = 2;
}
public static void insert(int k, int x) {
e[idx] = x;
l[idx] = k;
r[idx] = r[k];
l[r[k]] = idx;
r[k] = idx++;
}
public static void remove(int k) {
l[r[k]] = l[k];
r[l[k]] = r[k];
}
for (int i = r[0]; i != 1; i = r[i]) {
pw.print(e[i] + " ");
}
for (int i = l[1]; i != 0; i = l[i]) {
pw.print(e[i] + " ");
}
练习
01 双链表

import java.io.*;
public class Main {
public static final int N = 100010;
public static int M;
public static int[] e = new int[N];
public static int[] l = new int[N];
public static int[] r = new int[N];
public static int idx;
public static void init() {
r[0] = 1;
l[1] = 0;
idx = 2;
}
public static void insert(int k, int x) {
e[idx] = x;
l[idx] = k;
r[idx] = r[k];
l[r[k]] = idx;
r[k] = idx++;
}
public static void remove(int k) {
l[r[k]] = l[k];
r[l[k]] = r[k];
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
M = Integer.parseInt(br.readLine());
init();
while (M-- > 0) {
String[] str1 = br.readLine().split(" ");
if (str1[0].equals("L")) {
insert(0, Integer.parseInt(str1[1]));
} else if (str1[0].equals("R")) {
insert(l[1], Integer.parseInt(str1[1]));
} else if (str1[0].equals("IL")) {
insert(l[Integer.parseInt(str1[1]) + 1], Integer.parseInt(str1[2]));
} else if (str1[0].equals("IR")) {
insert(Integer.parseInt(str1[1]) + 1, Integer.parseInt(str1[2]));
} else {
remove(Integer.parseInt(str1[1]) + 1);
}
}
for (int i = r[0]; i != 1; i = r[i]) {
pw.print(e[i] + " ");
}
pw.close();
br.close();
}
}