PAT甲级-1052 Linked List Sorting

题目

题目大意

给定一个链表,要求按链表中的数值从小到大排序生成新的链表。输出有效节点的个数和链表的起始地址,以及链表本身。

思路

链表用结构体数组来表示,然后用sort自定义排序。需要注意的是,链表中存在无效节点,因此需要遍历一遍链表,将有效的节点筛选出来。同时也要注意格式化输出(测试点3是链表首地址格式化输出)。测试点4是当没有有效节点时,要输出0 -1。

代码

cpp 复制代码
#include <iostream>
#include <algorithm>
using namespace std;

struct node{
    int now;  // 当前节点的地址
    int key;  // 节点值
    int next;  // 下一个节点的地址
}v[100000];
int n, s;

bool cmp(node x, node y){
    return x.key < y.key;
}

int main(){
    cin >> n >> s;
    for (int i = 0; i < n; i++){
        int ads;
        cin >> ads;
        v[ads].now = ads;
        cin >> v[ads].key >> v[ads].next;
    }

    vector<node> res;  // 记录有效链表的节点
    for (int i = s; i != -1; i = v[i].next){
        res.push_back(v[i]);
    }

    sort(res.begin(), res.end(), cmp);
    if (!(int)res.size()){
        cout << "0 -1" << endl;  //测试点4
        return 0;
    }
    printf("%d %05d\n", (int)res.size(), res[0].now);  // 测试点3,首地址也要格式化输出
    for (int i = 0; i < (int)res.size(); i++){
        printf("%05d %d ", res[i].now, res[i].key);  // 注意要格式化输出
        if (i == (int)res.size() - 1){
            printf("-1\n");
        }else{
            printf("%05d\n", res[i + 1].now);
        }
    }

    return 0;
}
相关推荐
huang579147几秒前
从缓存行角度优化链表遍历:批处理与预取策略
数据结构·链表·缓存
anew___9 小时前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
吞下星星的少年·-·9 小时前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
stolentime10 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
tdtsmt11 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++
Msshu12312 小时前
2~5串锂电快充优选|XSP36 Type‑C升压/升降压快充管理芯片
数据结构·随机森林·贪心算法·排序算法·线性回归·启发式算法
m0_7345717614 小时前
深入理解C++ 析构函数<一>基本概念
开发语言·c++
动词ing15 小时前
【学习笔记】数据结构栈与队列(栈先进后出+队列先进先出+括号匹配+消消乐模型)
数据结构·笔记·学习
t-think15 小时前
C++ string 类(上)—— string类初识与常用接口详解
开发语言·c++
a1879272183115 小时前
【算法】链表(二):链表上的双指针——变速、异链与定距,和一份路程账本
数据结构·算法·leetcode·链表·go·指针·环形链表