pat乙级2021冬季真题 7-5 静态链表的秩 (25 分)

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;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值