用数组模拟双链表,图例参考了 Bug_FreeOωO 大神的题解。
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int e[N], l[N], r[N], idx;
void init()
{
r[0] = 1, l[1] = 0; //0的右边是1,1的左边是0
idx = 2; //链表初始已经有两个值了,所以idx从2开始
}
void add(int k, int x)
{
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx ++ ;
}
void remove(int k)
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
int main()
{
int m;
cin >> m;
init();
while (m -- )
{
string op;
int k, x;
cin >> op;
if (op == "L") //在最左端插入等于在0的右边插入
{
cin >> x;
add(0, x);
}
else if (op == "R") //在最右端插入等于在1的左边插入
{
cin >> x;
add(l[1], x);
}
else if (op == "D")
{
cin >> k;
remove(k + 1);
}
else if (op == "IL")
{
cin >> k >> x;
add(l[k + 1], x);
}
else
{
cin >> k >> x;
add(k + 1, x);
}
}
//r[0],即 0 的右侧是头指针; l[idx],即idx的左侧是尾指针
for (int i = r[0]; i != 1; i = r[i]) printf("%d ", e[i]);
return 0;
}