编程题 02-线性结构3 Reversing Linked List【PAT】

文章目录

编程练习题目集目录

题目

Given a constant K K K and a singly linked list L L L, you are supposed to reverse the links of every K K K elements on L L L. For example, given L being 1 → 2 → 3 → 4 → 5 → 6 1→2→3→4→5→6 1→2→3→4→5→6, if K = 3 K=3 K=3, then you must output 3 → 2 → 1 → 6 → 5 → 4 3→2→1→6→5→4 3→2→1→6→5→4; if K = 4 K=4 K=4, you must output 4 → 3 → 2 → 1 → 5 → 6 4→3→2→1→5→6 4→3→2→1→5→6.

输入格式

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N ( ≤ 1 0 5 ) N(≤10^5) N(≤105) which is the total number of nodes, and a positive K ( ≤ N ) K(≤N) K(≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by − 1 -1 −1.

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

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

输出格式

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

输入样例

00100 6 4

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

输出样例

00000 4 33218

33218 3 12309

12309 2 00100

00100 1 99999

99999 5 68237

68237 6 -1

题解

解题思路

使用两个数组 d a t a data data 和 n e x t next next 分别存储每个节点的数据和指向下一个节点的指针。从头节点开始,按顺序将节点的地址存储在数组 l i s t list list 中,构建链表的顺序结构。将 l i s t list list 中的节点按分组大小 K K K 进行反转。将反转后的节点顺序存储在结果数组 r e s u l t result result 中,即可。

完整代码

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

int main(void) {
    int number, k, n, sum = 0;
    cin >> number >> n >> k;
    int temp, data[100005], next[1000005], list[100005], result[100005];

    // 读取链表节点信息
    for (int i = 0; i < n; i++) {
        cin >> temp;
        cin >> data[temp] >> next[temp];
    }

    // 构建初始链表顺序
    while (number != -1) {
        list[sum++] = number;
        number = next[number];
    }

    // 复制初始链表到结果数组
    for (int i = 0; i < sum; i++) result[i] = list[i];

    // 按照分组大小 K 反转链表中的每个分组
    for (int i = 0; i < (sum - sum % k); i++)
        result[i] = list[i / k * k + k - 1 - i % k];

    // 输出反转后的链表
    for (int i = 0; i < sum - 1; i++)
        printf("%05d %d %05d\n", result[i], data[result[i]], result[i + 1]);
    printf("%05d %d -1", result[sum - 1], data[result[sum - 1]]);

    return 0;
}
相关推荐
leiming61 分钟前
c++ find_if 算法
开发语言·c++·算法
yuanmenghao3 分钟前
自动驾驶中间件iceoryx - 内存与 Chunk 管理(三)
数据结构·c++·算法·链表·中间件·自动驾驶
_OP_CHEN9 分钟前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
茶猫_18 分钟前
C++学习记录-旧题新做-链表求和
数据结构·c++·学习·算法·leetcode·链表
王老师青少年编程27 分钟前
信奥赛C++提高组csp-s之并查集(案例实践)1
数据结构·c++·并查集·csp·信奥赛·csp-s·提高组
谢娘蓝桥27 分钟前
adi sharc c/C++ 语言指令优化
开发语言·c++
郑泰科技28 分钟前
fmm(快速地图匹配)实践:Unknown toolset: vcunk的解决方案
c++·windows·交通物流
a3535413821 小时前
设计模式-原型模式
开发语言·c++
liulilittle1 小时前
libxdp: No bpffs found at /sys/fs/bpf
linux·运维·服务器·开发语言·c++
星火开发设计1 小时前
堆排序原理与C++实现详解
java·数据结构·c++·学习·算法·排序算法