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

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

相关推荐
颜x小1 小时前
[C#] C++与c#语法对比
开发语言·c++·c#
ldmd2841 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成
国科安芯1 小时前
FreeRTOS RISC-V 浮点上下文切换移植:在 IAR 工程中完整保存 FPU 寄存器
java·开发语言·单片机·嵌入式硬件·算法·系统架构·risc-v
小陈phd2 小时前
集成检索介绍
算法
小poop2 小时前
轮转数组:从暴力到最优,一题掌握算法复杂度分析
数据结构·算法·leetcode
樱桃读报僵尸2 小时前
说说 LLMRouter,Agent 执行过程中怎么动态的选择 LLM
算法
汉克老师2 小时前
GESP2026年3月认证C++八级( 第三部分编程题(2、子图最短路)精讲
c++·最短路·floyd·gesp8级
gis开发之家3 小时前
《Vue3 从入门到大神40篇》Vue3 源码详解(十):diff 算法全解析 —— 为什么 Vue3 比 Vue2 更快?
javascript·算法·typescript·前端框架·vue3·vue3源码
进击的丸子3 小时前
虹软人脸服务器SDK-C++语言Demo实操指南
后端·算法
abcd_zjq3 小时前
海康线扫相机使用
c++·海康