这种双链表最容易混淆的就是下标0代表左端点下标,1代表右端点下标。不是 l[0] 代表左端点, r[1] 代表右端点。
#include<iostream>
using namespace std;
const int N = 1e6;
int e[N],l[N],r[N],idex = 2;
void init(){
r[0] = 1;//0表示左端点
l[1] = 0;//1表示右端点
}
void funll(int x){//左端插入
e[idex] = x;
l[idex] = 0;
l[r[0]] = idex;
r[idex] = r[0];
r[0] =idex;
idex++;
}
void funrr(int x){//右端插入
e[idex] = x;
r[idex] = 1;
r[l[1]] = idex;
l[idex] = l[1];
l[1] = idex;
idex++;
}
void fundd(int k){//删除第k个值
k++;
r[l[k]] = r[k];
l[r[k]] = l[k];
}
void funill(int k,int x){//删除第k个左边的值
k++;
e[idex] = x;
r[idex] = k;
r[l[k]] = idex;
l[idex] = l[k];
l[k] = idex;
idex++;
}
void funirr(int k,int x){//删除第k个右边的值
k++;
e[idex] = x;
l[idex] = k;
l[r[k]] = idex;
r[idex] = r[k];
r[k] = idex;
idex++;
}
void showw(){//遍历
int p = r[0];
while(p!=1){
cout<<e[p]<<" ";
p = r[p];
}
}
int main (){
int m;cin>>m;
init();
for(int i = 0;i<m;++i){
string op;cin>>op;
if(op=="L"){
int x;cin>>x;
funll(x);
}
else if(op=="R"){
int x;cin>>x;
funrr(x);
}
else if(op=="D"){
int k;cin>>k;
fundd(k);
}
else if(op=="IL"){
int k,x;cin>>k>>x;
funill(k,x);
}
else if(op=="IR"){
int k,x;cin>>k>>x;
funirr(k,x);
}
}
showw();
return 0;
}