问题 C: 瑞神要考研(重排链表)

问题 C: 瑞神要考研

时间限制: 1 Sec   内存限制: 128 MB
提交: 219   解决: 43
[ 提交][ 状态][ 讨论版]

题目描述

瑞神要准备考研了,为了复习数据结构,瑞神在某宝上买了一本数据结构得考研辅导资料《考研数据结构---从入门到放弃》,从此瑞神开始了愉快的复(zhuang)习(bi)。
有一天,瑞神找了好多条链表来辅助自己复习,但是他在复习的过程中一不小心把链表掉在了地上,捡起来的时候链表以及断成了好多个结点,每个结点只保留了当前结点的地址、结点的值和下一个结点的地址。瑞神看着这些结点浑身难受无法复习,为了让瑞神继续复(zhuang)习(bi)下去,请你帮瑞神把链表复原。

输入

第一行给出结点的个数n(1<=n<=100000)。
接下来n行每行给出一个结点的信息:结点地址、值和下一个结点的地址。
地址为5位数字,-1表示地址为NULL。
保证每一条链表的最后一个结点的下一个结点地址为-1。


输出

每一行输出一条链表,只输出每个节点的值。

多条链表按照首结点地址从小到大排序。


因为题目要求的是按照每条链表的首节点的地址排序,并且指定了尾节点,所以倒着链接链表,然后找出链表里的值保存下来,然后正向输出即可。

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<cstdio>
#include <cstring>
 
using namespace std;
const int maxn = 100000+10;
int T;
struct Node
{
    int in,value,next;
};
struct List
{
    Node x;
    vector<int>Vc;
    int in;
};
List V[maxn];
vector<Node>Ve;
Node s[maxn];
map<int,int> Map;
map<int,int> Value;
bool cmp(const List& t1,const List& t2)
{
    return t1.in<t2.in;
}
int main()
{
    scanf("%d",&T);
    for(int i=0;i<T;i++)
    {
        scanf("%d%d%d",&s[i].in,&s[i].value,&s[i].next);
        Map[s[i].next]=s[i].in;
        Value[s[i].in]=s[i].value;
        if(s[i].next==-1)
        {
            Ve.push_back(s[i]);
        }
    }
 
    for(int i=0;i<Ve.size();i++)
    {
        int t= Ve[i].in ;
        while(1)
        {
            if(t==0) break;
            V[i].Vc.push_back( Value[ t ] );
            V[i].in=t;
            t=Map[t];
 
        }
//        for(int j=Vc[i].size()-1;j>=0;j--)
//        {
//            if(j==Vc[i].size()-1)
//            cout << Vc[i][j] ;
//            else cout<< " " << Vc[i][j] ;
//        }
//        cout << endl;
    }
    sort(V,V+Ve.size(),cmp);
    for(int i=0;i<Ve.size();i++)
    {
        for(int j=V[i].Vc.size()-1;j>=0;j--)
        {
            cout << V[i].Vc[j] << " ";
        }
        cout << endl;
    }
 
    return 0;
}





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值