0.前言
老师布置的作业题。
有点水
1.正文
具体思路
数组实现简单的双链表操作:插入、删除。
注意事项
删除时记得标记,已不在队列中的忽略。
代码
#include <cstdio>
const int N = 100000;
int idx, e[N+5], fr[N+5], ne[N+5];
void init()
{
idx = 2;
fr[1] = 0;
ne[0] = 1;
}
void insertL(int k, int x)
{
fr[idx] = fr[k];
ne[idx] = k;
ne[fr[idx]] = idx;
fr[k] = idx;
e[idx++] = x;
}
void insertR(int k, int x)
{
ne[idx] = ne[k];
fr[idx] = k;
fr[ne[idx]] = idx;
ne[k] = idx;
e[idx++] = x;
}
void delX(int k)
{
fr[ne[k]] = fr[k];
ne[fr[k]] = ne[k];
fr[k] = -1;
ne[k] = -1;
}
int main() {
init();
int n, k, p, m, x;
scanf("%d", &n);
for (int i=2; i<=n; i++) {
scanf("%d %d", &k, &p);
if (p) insertR(k, i);
else insertL(k, i);
}
scanf("%d", &m);
for (int i=1; i<=m; i++) {
scanf("%d", &x);
if (fr[x]==-1 && ne[x]==-1) continue;
delX(x);
}
for (int i=1; i<=n; i++) {
if (fr[i] == 0) {
x = i;
break;
}
}
do {
printf("%d ", x);
x = ne[x];
}while (x > 0);
printf("\n");
return 0;
}