acwing 827.双链表
算法:(数组模拟双链表)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6+5;
int e[N],l[N],r[N],idx;
void init() //初始化
{
r[0]=1,l[1]=0; //头结点为0号,尾结点为1号
idx=2;
}
void insertKR(int k,int x) //RL操作
{
e[idx]=x;
l[idx]=k,r[idx]=r[k];
l[r[k]]=idx,r[k]=idx++;
}
void insertKL(int k,int x) //IL操作
{
insertKR(l[k],x); //即在左边结点的右边插入
}
void insertL(int x) //L操作
{
e[idx]=x;
l[idx]=0,r[idx]=r[0];
l[r[0]]=idx,r[0]=idx++;
}
void insertR(int x) //R操作
{
e[idx]=x;
l[idx]=l[1],r[idx]=1;
r[l[1]]=idx,l[1]=idx++;
}
void deleteK(int k) //D操作
{
r[l[k]]=r[k];
l[r[k]]=l[k];
}
int main ()
{
init();
int m;cin>>m;
while (m--)
{
string op;cin>>op;
int k,x;
if (op=="L")
{
cin>>x;
insertL(x);
}
else if (op=="R")
{
cin>>x;
insertR(x);
}
else if (op=="IL")
{
cin>>k>>x;
insertKL(k+1,x); //第k个插入的数就是第k+1节点
}
else if (op=="IR")
{
cin>>k>>x;
insertKR(k+1,x);
}
else
{
cin>>k;
deleteK(k+1);
}
}
for (int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' '; //双链表从左到右输出
return 0;
}
/*
输入样例:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
输出样例:
8 7 7 3 2 9
*/