“隊列復原”問題

隊列復原

問題描述
小瓜現在讓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;
}

顯然,這樣做的前提有兩個:第一,存儲的整型數字。第二,存儲的數字不能超出下標的範圍(不能越界)

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