“队列复原”问题

队列复原

问题描述
小瓜现在让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;
}

显然,这样做的前提有两个:第一,存储的整型数字。第二,存储的数字不能超出下标的范围(不能越界)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章