AcWing 827. 双链表
原题链接
简单
作者:
08-69
,
2021-04-10 10:16:14
,
所有人可见
,
阅读 2
#include<bits/stdc++.h>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=100000+10;
int e[N],r[N],l[N],idx; //e是值,ne是下一个节点,idx是地址(每个节点的地址不连续但一定不相同),h是头节点(因为是头插法)
void init(){ //初始化
r[0]=1;
l[1]=0;
idx=2;
}
void add_L(int x){ //在左侧头插入一个x
e[idx]=x;
l[idx]=0;
r[idx]=r[0];
l[r[0]]=idx;
r[0]=idx;
idx++;
}
void add_R(int x){ //在右侧头插入一个x
e[idx]=x;
r[idx]=1;
l[idx]=l[1];
r[l[1]]=idx;//
l[1]=idx;
idx++;
}
void remov(int k){ //删除第k个插入的数
k++;
r[l[k]]=r[k];
l[r[k]]=l[k];
}
void add_k_l(int k,int x){ //在第 k 个插入的数左侧插入一个数
k++;
e[idx]=x;
l[idx]=l[k];
r[idx]=k;
r[l[idx]]=idx;
l[k]=idx;
idx++;
}
void add_k_r(int k,int x){ //在第 k 个插入的数右侧插入一个数
k++;
e[idx]=x;
r[idx]=r[k];
l[idx]=k;
l[r[idx]]=idx;
r[k]=idx;
idx++;
}
int main()
{
int m,k,x;
string s;
init();
cin>>m;
while(m--){
cin>>s;
if(s=="L"){
cin>>x;
add_L(x);
}
else if(s=="R"){
cin>>x;
add_R(x);
}
else if(s=="IL"){
cin>>k>>x;
add_k_l(k,x);
}
else if(s=="IR"){
cin>>k>>x;
add_k_r(k,x);
}
else{
cin>>k;
remov(k);
}
}
//双链表遍历代码
for(int i=r[0];i!=1;i=r[i]){
cout<<e[i]<<' ';
}
return 0;
}