隊列復原
問題描述
小瓜現在讓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;
}
顯然,這樣做的前提有兩個:第一,存儲的整型數字。第二,存儲的數字不能超出下標的範圍(不能越界)