7-5 静态链表的秩 (25 分)
静态链表是指将一个有 n 个结点的链表存放在一个有 n 个单元的数组里,每个数组单元包含一个整型的 data 域和一个 next 指针,指针里存的是链表下一个结点在数组里对应的单元下标。题目保证给出的链表是一个线性表,即除了第一个结点外,每个结点有其唯一的前驱结点;除了最后一个结点外,每个结点有其唯一的后继结点。
你的任务是将这个链表上的结点顺序编号,即从第一个结点开始,从 1 到 n 给每个结点顺次编号 —— 这个编号就叫结点的“秩”。
输入格式:
输入第一行给出一个正整数 n (≤10
5
),为链表中的结点个数。第二行给出 n 个数字,第 i (i=0,⋯,n−1) 个数字对应数组第 i 个单元存储的 next(i) 的值,空指针用 −1 表示。数字间以空格分隔。
输出格式:
在一行中输出 n 个数字,第 i (i=0,⋯,n−1) 个数字对应第 i 个单元存储的结点在链表中的秩。数字间以 1 个空格分开,行首尾不得有多余空格。
输入样例:
5
3 -1 4 1 0
输出样例:
3 5 1 4 2
样例说明:
输入的链表为 2->4->0->3->1->空。于是第 0 个单元所存的结点的秩是 3,因为它是链表中的第 3 个结点;第 1 个单元所存的结点的秩是 5,因为它是链表中的第 5 个结点;以此类推。
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
cin>>n;
int begin;
map<int,int> m;
map<int,int>::iterator it;
vector<int> v;
int arr[n];
for(int i=0;i<n;i++){
int x;
cin>>x;
m[x]=i;//输入值对应其前驱
}
begin=-1;
for(int i=0;i<n;i++){
it=m.find(begin);//找到最后一个next
v.push_back(it->second);//添入其前驱
begin=it->second;
}
reverse(v.begin(),v.end());//得到的链表逆转后为输入的链表
for(int i=0;i<v.size();i++){
arr[v[i]]=i+1;
}
for(int i=0;i<n;i++)
if(i==0) cout<<arr[i];
else cout<<" "<<arr[i];
return 0;
}