AcWing 827. 双链表
原题链接
简单
作者:
minux
,
2020-04-22 19:11:21
,
所有人可见
,
阅读 466
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int E[N]; // 存储指针i的元素
int L[N]; // 存储指针i的左侧元素
int R[N]; // 存储指针i的右侧元素
int idx;
enum{HEAD, TAIL};
int m;
void init(){
// 令0表示head, 1表示tail
R[HEAD]=TAIL;
L[TAIL]=HEAD;
idx=2;
}
// 在下标为k的点的右侧插入x
void kIns(int k, int x){
E[idx]=x;
L[idx]=k; // idx的左侧为k
R[idx]=R[k]; // idx的右侧为原来k的右侧(R[k])
L[R[k]]=idx; // 原来k的右侧的左侧为idx
R[k]=idx; // k的右侧为idx
idx++;
}
// 删除下标为k的节点
void remove(int k){
R[L[k]]=R[k];
L[R[k]]=L[k];
}
int main(){
cin>>m;
init();
while(m--){
int k, x;
string P;
cin>>P;
if(P=="L"){
cin>>x;
kIns(HEAD, x);
}
else if(P=="R"){
cin>>x;
kIns(L[TAIL], x);
}
else if(P=="D"){
cin>>k;
remove(k+1);
}
else if(P=="IL"){
cin>>k>>x;
kIns(L[k+1], x);
}
else if(P=="IR"){
cin>>k>>x;
kIns(k+1, x);
}
}
for(int i=R[HEAD]; i!=TAIL; i=R[i]) cout<<E[i]<<" ";
return 0;
}