很明显是要用链表的,主要写写用指针的链表,然后要注意一个技巧就是如何快速地查找某个学生的位置。在这道题中,所有的数据均为整数,所以我们可以让同学们的号码和que一 一对应。也就是说,如果需要寻找i号同学,直接使用que[i]即可,这么做不仅使我们的代码更为简单易懂,更重要的是节约了大量的宝贵时间。然后,用指针写的链表也有两种选择,即你是用一个指向数据类型的指针数组还是直接一个保存数据类型的数组。感觉上是用指针比较好,因为这道题可以不用new,你知道了所有数据的长度,但在很多题目中需要新建的链表长度是不确定的。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
int val;
node*left,*right;
}G[100005];//直接保存数据类型
bool inque[100005];
int main()
{
int n,i,j,k,m;
cin>>n;
for(i=1;i<=n;i++)G[i].val=i;inque[1]=true;int head=1;//记录队头
for(i=2;i<=n;i++){
int p;cin>>k>>p;inque[i]= true;
if(!p){
if(k==head)head=i;//注意队头的变更
if(G[k].left){
G[i].left=G[k].left;
G[k].left->right=&G[i];//注意要加上取地址符
}
G[i].right=&G[k];
G[k].left=&G[i];
}
else{
if(G[k].right){
G[i].right=G[k].right;
G[k].right->left=&G[i];
}
G[i].left=&G[k];
G[k].right=&G[i];
}
}
cin>>m;
for(i=1;i<=m;i++){
int x;cin>>x;
if(!inque[x])continue;
inque[x]=false;
if(x==head)head=G[x].right->val;//队头变更
if(G[x].left){
G[x].left->right=G[x].right;
}
if(G[x].right){
G[x].right->left=G[x].left;
}
}
cout<<G[head].val;
while(G[head].right){
head=G[head].right->val;
cout<<' '<<G[head].val;
}
cout<<endl;
return 0;
}
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct stu {
int id;
bool removed;
stu*prev, *next;
stu():prev(0),next(0){};
};
stu*d[100005];
int head = 1;
void add(int x, int k, int p)
{
d[x] = new stu();d[x]->id=x;
if (!p) {
if (d[k]->prev)//一定不要忘了判断这个!!
d[k]->prev->next = d[x];
d[x]->prev = d[k]->prev;
d[k]->prev = d[x];
d[x]->next = d[k];
if (k == head)
head = x;
}
else {
if (d[k]->next)//不要忘了判断!!!
d[k]->next->prev = d[x];
d[x]->next = d[k]->next;
d[x]->prev = d[k];
d[k]->next = d[x];
}
}
int main()
{
int n, i, j, p, k;
cin >> n;
d[1] = new stu();d[1]->id=1;d[1]->removed=false;
for (i = 1; i < n; i++) {
cin >> k >> p;
add(i + 1, k, p);
}
int m; cin >> m; int cnt = n;
for (i = 1; i <= m; i++) {
cin >> j;
if (!d[j]->removed) {
cnt--;
d[j]->removed = true;
}
}
stu*e = d[head];
while (e) {
if (!e->removed) {
cout << e->id;
if (--cnt)cout << " ";
else cout << endl;
}
e = e->next;
}
return 0;
}