队列复原
问题描述
小瓜现在让1到n这n个整数排成一列,但是他只告诉你每个整数的后面那个数是什么(最后一个整数的后面那个数是0),请你帮忙复原这个队列。
输入
第一行一个整数n(n<=100000),表示有n个整数。
接下来n行,每行两个数i,j,表示排在整数i后面的那个数是j。
输出
n行,每行一个整数,表示完整的队列。
输入样例
4
1 3
2 4
3 2
4 0
输出样例
1
3
2
4
解题思路
这一题要求用数组模拟链表。对于输入中每一行的i,j两个数,可以把j看成是下标,把i看成是值。那么第k个数的值x就可以作为第k+1个数的下标。
参考代码
#include <iostream>
using namespace std;
int a[100000];
int b[100000];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i ++){
int c, d;
cin >> c >> d;
a[d] = c;
}
int index = 0;
for(int i = 0; i < n; i ++){
b[i] = a[index];
index = a[index];
}
for(int i = n - 1; i >= 0; i --){
cout << b[i] << endl;
}
return 0;
}
更多思考
既然可以用数组创建一个链表,那么是否可以完成增删改查等操作呢?显然是可以的。
以增为例,输入两个数字,表示在第一个数字后插入第二个数字。如“1 5”表示在1后插入5,参考代码如下:
int c, d;
cin >> c >> d;
int index = -1;
int num_i = 0;
for(int j = 0; j < n + 1; j ++){ //n表示链表长度
if(a[num_i] == c){
index = num_i;
break;
}else{
num_i = a[num_i];
}
}
if(index != -1){
a[index] = d;
a[d] = c;
}
显然,这样做的前提有两个:第一,存储的整型数字。第二,存储的数字不能超出下标的范围(不能越界)