答案(含注释)
#include<iostream>
using namespace std;
const int N=100010;
int m;
int e[N],l[N],r[N],idx;
//e[idx]=value l[idx]=idx类 r[idx]=idx类
//void init(){
// r[0]=1;
// l[1]=0;
// //一开始左边界节点指向右边界节点,右边界节点指向左边界节点
// idx=2;
//}
void insert(int k,int x){//在索引为k的点后面(右边)加入x
e[idx]=x;
l[idx]=k;
r[idx]=r[k];
l[r[k]]=idx;
r[k]=idx;
idx++;
}
void remove(int k){//删除索引为k的点
l[r[k]] =l[k];
r[l[k]] =r[k];
}
int main(){
cin>>m;
// 0是左端点,1是右端点
r[0] = 1, l[1] = 0;
idx = 2;
//init();
// 0 是左边界 1是右边界
//因为0和1都被占用,所以第1个插入的节点的idx也就是2=1+1 ,第2个插入的节点的idx为3=2+1;
//∴第k个节点也就是k+1
while(m--){
string op;
cin>>op;//这里要注意统一使用''还是"" 如果有多字符就全用""
int k,x;
if(op=="L"){
cin>>x;
insert(0,x);//在最左边加入 就是在idx=0左端点后加入
}else if(op=="R"){
cin>>x;
insert(l[1],x);//在最右边加入就是在右端点左侧加入
//就是在右端点左边那个点(索引为l[1])的右边加入
}else if(op=="D"){
cin>>k;
remove(k+1);//第k个插入的点的索引是k+1
}
else if(op=="IL"){
cin>>k>>x;
insert(l[k+1],x);//索引为k+1的点前面加入
//也就是在该点左边点的后面入一个
}
else{
cin>>k>>x;
insert(k+1,x); //索引为k+1的点后面加入 直接k+1后面
}
}
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';
cout<<endl;
return 0;
}
我一开始做的时候对比了好多好多遍不知道为什么自己的错误 后来发现!!
遍历输出的终止条件是i!=1 不再是不等于-1!!!!!!!!!没有head那个了
和单链表不一样!
for(int i=r[0];i!=1;i=r[i]) cout<<e[i]<<' ';