插入操作的指针修改顺序: 代码: #include <iostream> using namespace std; const int N = 1e5 + 10; // e[i]代表i结点的值; l[i]代表i结点左边结点的下标; r[i]代表i结点右边结点的下标; idx代表当前可用结点的下标 int e[N], l[N], r[N], idx; // 初始化 // 初始的时候有两个结点,左边结点下标为0,右边结点下标为1; 0永远是最左边的结点,1永远是最右边的结点 void init() { r[0] = 1; l[1] = 0; // 0和1结点已经用了,可用结点从2开始 idx = 2; } // 在下标为k的结点右边插入一个结点 // 如果是在k的左边插入一个结点,相当于在k的左边的结点的右边插入一个结点,等价于add(l[k], x); void add(int k, int x) { e[idx] = x; r[idx] = r[k], l[idx] = k; l[r[k]] = idx, r[k] = idx; idx ++ ; } // 删除下标为k的结点 void remove(int k) { l[r[k]] = l[k]; r[l[k]] = r[k]; } int main() { int m; cin >> m; // 一定记得先初始化链表! init(); while (m -- ) { string op; cin >> op; if (op == "L") { int x; cin >> x; add(0, x); } else if (op == "R") { int x; cin >> x; add(l[1], x); } else if (op == "D") { int k; cin >> k; remove(k + 1); } else if (op == "IL") { int k, x; cin >> k >> x; add(l[k + 1], x); } else if (op == "IR") { int k, x; cin >> k >> x; add(k + 1, x); } } // 输出链表 for (int i = r[0]; i != 1; i = r[i]) printf("%d ", e[i]); return 0; }