这个题目用linkedlist代码很好写,但是会超时,原因是每次找到节点比较消耗时间
自己定义一个class,实现一个双向链表
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
/**
* 这个题目用linkedlist代码很好写,但是会超时,原因是每次找到节点比较消耗时间
* 自己定义一个class,实现一个双向链表
*/
public class Main {
static boolean[] out;
static Node1160[] nodes;
public static void main(String[] args) throws Exception{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(reader.readLine());
int N=Integer.parseInt(st.nextToken());//一共有N个学生
nodes=new Node1160[N+1];
for (int i = 0; i <N+1 ; i++) {
nodes[i]=new Node1160();
nodes[i].index=i;
}
out=new boolean[N+1];
/*LinkedList<Integer> list=new LinkedList<Integer>();
list.add(1);*/
for (int i = 2; i <=N ; i++) {
st=new StringTokenizer(reader.readLine());
int K=Integer.parseInt(st.nextToken());//K是要插入的节点位置
int P=Integer.parseInt(st.nextToken());
Node1160 node=nodes[K];
int pre=node.pre;
int next=node.next;
if(P==0){//插入到K的左边
nodes[pre].next=i;
nodes[K].pre=i;
nodes[i].pre=pre;
nodes[i].next=K;
}else{
nodes[K].next=i;
nodes[next].pre=i;
nodes[i].pre=K;
nodes[i].next=next;
}
//System.out.println(list);
}
int M=Integer.parseInt(reader.readLine());//出M个数字
for (int i = 0; i <M ; i++) {
int x=Integer.parseInt(reader.readLine());
if(!out[x]){//如果没有弹出,弹出的就不用重复弹出了
nodes[x].index=-1;
out[x]=true;
}
}
Node1160 n=nodes[0];
while(n.next!=0){
n=nodes[n.next];
if(n.index!=-1){
System.out.print(n.index+" ");
}
}
reader.close();
}
}
class Node1160{
int index;
int pre;
int next;
}