一般法
0.声明头节点
1.将1号同学插入链表中
2.for(i:2~n)
a.输入 k p
b.申请新的链表空间 存储 i
c.寻找k的位置 O(n)
d.根据p 插入 O(1)
3.输入m
a.for(i:1~m) 输入x
b.寻找x O(n)
c.删除x O(1)
4.输出
代码省去
优化法
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
typedef struct node
{
int data;
int next;
int pre;
bool vis;
}node;
node Lis[100005]={0};//空间足够
int main() {
int n;
cin>>n;
int h=0;
Lis[h].pre=Lis[h].next=-1;
Lis[1].data=1;
Lis[1].vis=true;
Lis[1].pre=Lis[1].next=-1;
Lis[h].next=1;
Lis[1].pre=h;//对于头节点h和第一个编号进行处理
for(int i=2;i<=n;i++)
{
int k,p;
cin>>k>>p;
Lis[i].data=i;
Lis[i].vis=true;
Lis[i].pre=Lis[i].next=-1;//对于第i个序号的人进行处理
if(p)//p为1 右插
{
int r=Lis[k].next;
Lis[i].pre=k;
Lis[i].next=r;
Lis[k].next=i;
if(r!=-1)
{
Lis[r].pre=i;
}
}
else//左插
{
int l=Lis[k].pre;
Lis[i].pre=l;
Lis[i].next=k;
Lis[k].pre=i;
Lis[l].next=i;
}
}
// while(p!=-1)
// {
// cout<<Lis[p].data<<" ";
// p=Lis[p].next;
// }
// cout<<endl;//调试
int m;
cin>>m;
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
Lis[x].vis=false;//改变状态
}
int p=Lis[h].next;
while(p!=-1)
{
if(Lis[p].vis)//vis为真
{
cout<<Lis[p].data<<" ";
}
p=Lis[p].next;//p向后移动,放在if外面
}
return 0;
}