18925 试卷排序(双向链表)
时间限制:1000MS 代码长度限制:10KB
提交次数:0 通过次数:0
题型: 编程题 语言: 不限定
Description
老师要将N张试卷重新排序,每张试卷都有编号为1∼N,采取如下的方法:
先将编号1的试卷放进队列,剩下从第2张到第N张依次放入队列,
放入的时候老师会把编号i的试卷插入到编号为x试卷之前或之后(x<i),
在老师完成这N-1次操作之后,请输出试卷序列的最终编号。
输入格式
第1行为一个正整数N,表示了有N张试卷。
第2-N行,第i行包含两个整数x,p,其中x为小于i的正整数,p为0或者1。
若p为0,则表示将第编号为i的试卷放入编号为x试卷的左边,为1则放入x试卷的右边。
输出格式
输出N个整数,表示完成插入后试卷系列中试卷的编号(1<=N<=100000)。
输入样例
4
1 0
2 1
1 0
输出样例
2 3 4 1
提示
4张试卷。第二行1,0,将编号2的试卷放入编号1的左边,则序列为2 1;
第三行2,1,将编号3试卷放入编号2试卷的右边,则序列为2 3 1;
第四行1 0,将编号4的试卷放入编号1的左边,则序列为2 3 4 1。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
using namespace std;
//造结构体 双向链表指针
typedef struct Test {
int num;
struct Test *last,*next;
}*LinkList,TNode;
int main() {
ios::sync_with_stdio(0), cin.tie(0);//减少cincout耗时
int n,i,j,k;
cin >> n;
LinkList p,q,r,head,t,tail;
//用指针数组装每个序号地址后续便于查找
LinkList addr[n+1];
//建立头指针和第一个节点
head = new TNode;
q = head;
p = new TNode;
p->num = 1;
p->next = NULL;
p->last = head;
//存取第一个节点地址
addr[1] = p;
head->next = p;
head->last = NULL;
//尾部也要造一个空节点 以便后续节点连接
tail = new TNode;
tail->last = p;
p->next = tail;
tail->next = NULL;
//从编号2开始插入
for (i = 2; i <= n; i++) {
cin >> j >> k;
//直接找到编号为j的指针
//如果用while查找会超时
r = addr[j];
//存储该节点的前后节点指针
q = r->last;
p = r->next;
//建立编号i的新节点t
t = new TNode;
t->num = i;
//t的地址要用指针数组存好
addr[i] = t;
//判断k操作
if (k==1) {
t->next = p;
t->last = r;
r->next = t;
p->last = t;
}else{
t->next = r;
r->last = t;
t->last = q;
q->next = t;
}
}
//从第一个节点开始输出n次
p = head->next;
while (n--) {
/*printf("%d ",p->num);*/
cout << p->num << ' ';
p = p->next;
}
return 0;
}