PAT甲级1052、Linked LIst Sorting

题目

A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the structures according to their key values in increasing order.

Input Specification:

Each input file contains one test case. For each case, the first line contains a positive N (<) and an address of the head node, where N is the total number of nodes in memory and the address of a node is a 5-digit positive integer. NULL is represented by −1.

Then N lines follow, each describes a node in the format:

复制代码
Address Key Next

where Address is the address of the node in memory, Key is an integer in −![10^5](https://latex.csdn.net/eq),![10^5](https://latex.csdn.net/eq), and Next is the address of the next node. It is guaranteed that all the keys are distinct and there is no cycle in the linked list starting from the head node.

Output Specification:

For each test case, the output format is the same as that of the input, where N is the total number of nodes in the list and all the nodes must be sorted order.

Sample Input:

复制代码
5 00001
11111 100 -1
00001 0 22222
33333 100000 11111
12345 -1 33333
22222 1000 12345

Sample Output:

复制代码
5 12345
12345 -1 00001
00001 0 11111
11111 100 22222
22222 1000 33333
33333 100000 -1

思路

这个题和1032那个题差不多,都是用到了静态链表,可以总结一下,先说思路吧

明显要用到排序,sort函数比较一下就好了

关键是要重排链表,在输出中next这一部分和输入时是不一样的,幸好不是指针链表,不然只能强行冒泡了

关键点有两个:

1、题目中说的是"有n个节点在内存中",并不一定有n个节点在链表中

2、n可以为0,又是这个玩意,以后还是默认positive包括0吧

cpp 复制代码
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
struct Node{
    int addr;
    int key;
    int next;
    bool flag;
}node[100005];

bool cmp(Node a,Node b)
{
    if(a.flag == false || b.flag == false)
        return a.flag > b.flag;
    else
        return a.key < b.key;
}
int main()
{
    int n,L;
    cin>>n>>L;
    for(int i=0;i<100005;i++)
        node[i].flag = false;
    
    for(int i=0;i<n;i++)
    {
        int add,k,nex;
        cin>>add>>k>>nex;
        node[add].addr = add;
        node[add].key = k;
        node[add].next = nex;
    }
    int cnt = 0;
    for(int i=L;i!=-1;)
    {
        node[i].flag = true;
        cnt++;
        i=node[i].next;
    }
    sort(node, node+100005, cmp);
    if(cnt)
        cout<<cnt<<" "<<setw(5)<<setfill('0')
            <<node[0].addr<<endl;
    else
        cout<<"0 -1"<<endl;
    for(int i=0;i<cnt;i++)
    {
        cout<<setw(5)<<setfill('0')<<node[i].addr
            <<" "<<node[i].key<<" ";
        if(node[i+1].flag == false)
            cout<<"-1"<<endl;
        else
            cout<<setw(5)<<setfill('0')<<node[i+1].addr<<endl;
    }
}

总结

静态链表首先要求总的节点数量(地址)不能太大,这样才能定义一个大数组

然后要求地址不连续,甚至是相当稀疏的

最后是在指针链表不太方便做的时候可以用,比如说大量的交换节点顺序、查询比较信息这些频繁使用链表信息的操作

顺带补一句

在1032那个题中我感觉用静态链表是输入格式的问题,输入的地址是离散的,毫无顺序的,也就是说无法轻易地构建指针链表,所以一开始就分配好空间的静态链表比较合适

所以我感觉看输入格式可能是最有效的方法

相关推荐
203号居民4 小时前
LeetCode hot 100 —41. 缺失的第一个正数
数据结构·算法·leetcode
专注仿真6 小时前
问答大模型技术方案算法实现-熵权法融合算法 + 交叉编码器重排算法
人工智能·python·算法·语言模型·问答大模型关键算法·熵权融合算法·交叉编码器重排算法
烧酒同学7 小时前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
地平线开发者8 小时前
量化为什么会有损失:从量化误差到精度下降
算法
手写码匠8 小时前
华为云Flexus+DeepSeek征文|Dify 多 Agent 会话管理与上下文工程实战:让智能体“记住该记住的,忘掉该忘掉的“
人工智能·深度学习·算法·aigc
2401_862880828 小时前
数据结构 --- 栈
c语言·数据结构·算法
致Great8 小时前
Qwen3.8-27B 接入 DSH 全流程实测:写代码、跑长任务,都没问题
算法
Tisfy9 小时前
LeetCode 3471.找出最大的几近缺失整数:三种情况判断
算法·leetcode·题解·分类讨论
linux-hzh10 小时前
百日算法修炼 · Day 12
算法·深度优先
@呱呱爱学习10 小时前
C++大成之路_ STL容器_ Vector
开发语言·c++