刚做完紫书链表章节的移动盒子,正好用来练练手。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100000 + 10;
int LL[maxn],RR[maxn];
int n,m;
int main()
{
scanf("%d",&n);
RR[0]=1;LL[0]=1;
LL[1]=0;RR[1]=0;
for(int i=2;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(b==0)//将i插在a的左边
{
int t=LL[a];
RR[t]=i;RR[i]=a;
LL[a]=i;LL[i]=t;
}
else if(b==1)//将i插在a的右边
{
int t=RR[a];
RR[a]=i;RR[i]=t;
LL[i]=a;LL[t]=i;
}
}
scanf("%d",&m);
for(int i=0;i<m;i++){
int a;
scanf("%d",&a);
if(LL[a]==0&&RR[a]==0)continue;//当a已经删除时,忽略指令
int ll=LL[a],rr=RR[a];
RR[ll]=rr;LL[rr]=ll;
LL[a]=0;RR[a]=0;//删除a
}
for(int i=RR[0];i!=0;i=RR[i])//输出链表
printf("%d ",i);
return 0;
}