问题描述
有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。
输入格式
第一行一个整数n。
第二行一个整数x。表示第一辆自行车的编号。
以下n-1行,每行3个整数x,y,z。
z=0时,表示编号为x的自行车恰停放在编号为y的自行车的左边
z=1时,表示编号为x的自行车恰停放在编号为y的自行车的右边
输出格式
从左到右输出停车棚里的自行车编号
样例输入
4
3
1 3 1
2 1 0
5 2 1
样例输出
3 2 5 1
数据规模和约定
n<=100000
自行车编号为不超过100000的正整数。
import java.util.Scanner;
public class Main {
/*
* 样例输入
4 //一共有4辆自行车
3 //第一辆自行车的编号
1 3 1 z=1, 1在3的右边 即 3 1(三个数依次对应x y z)
2 1 0 z=0, 2在1的左边 即 2 1
5 2 1 z=1, 5在2的右边 即2 5
思路:用双向链表解决
* */
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//自行车总数
int num = sc.nextInt();//第一辆自行车的编号
doubleNode first = new doubleNode();//创建双向链表
first.data = num;
first.prior = null;
first.next = null;
doubleNode xx = null,yy = null;
doubleNode[] local = new doubleNode[100005];//存放自行车的地址
local[num] = first;//第一辆自行车的地址
for(int i=1;i<n;i++){//依次向双向链表中插入数据
int x = sc.nextInt();
int y = sc.nextInt();
int z = sc.nextInt();
xx = new doubleNode();
xx.data = x;
local[x] = xx;//编号为x的自行车地址
yy = new doubleNode();
yy = local[y]; //获取编号y的自行车地址,存入的比x早
if(z==0){ //1.x放在y的左边(即将x插入到双向链表中结点yy的前面)
xx.next = yy;
if(yy.prior!=null){//yy结点不是头节点
xx.prior = yy.prior;
yy.prior.next = xx;
}else{
xx.prior = null;
}
yy.prior = xx; //y的前驱指针指向x
if(yy==first){//yy是头节点,则更改头节点
first = xx;
}
}//if
if(z==1){//2.x放在y的右边(即将x插入到双向链表中y的后面)
xx.prior = yy;
if(yy.next!=null){//yy结点不是尾结点
xx.next = yy.next;
yy.next.prior = xx;
}else{//yy是尾结点
xx.next = null;
}
yy.next = xx;
}//if
}//for
while(first != null){
System.out.print(first.data+" ");
first = first.next;
}
}
}
class doubleNode{//双向链表
int data;
doubleNode prior,next;
public doubleNode() {
}
public doubleNode(int data, doubleNode prior, doubleNode next) {
super();
this.data = data;
this.prior = prior;
this.next = next;
}
}