编程题 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;
}
相关推荐
fqbqrr1 小时前
2607C++,使用微软detours勾挂工具
c++
蓝悦无人机4 小时前
C++基础 — 函数总结
开发语言·c++
我不是懒洋洋5 小时前
从零实现一个分布式监控:Prometheus的核心设计
c++
An_s5 小时前
c++对接pdfium(一)win系统篇
开发语言·c++
众少成多积小致巨6 小时前
C++ 规范参考(上)
c++
一拳一个呆瓜9 小时前
【STL】iostream 编程:使用提取运算符
c++·stl
我不是懒洋洋10 小时前
从零实现一个分布式日志平台:ELK的核心设计
c++
神仙别闹10 小时前
基于QT(C++)实现Windows 自启动项查看和分析
c++·windows·qt
WWTYYDS_66611 小时前
ProtoBuf超详细使用教程
c++
野生风长11 小时前
c++类和对象(this指针,重载operator,习题总结)
java·开发语言·c++