• PAT 1074. Reversing Linked List (25)


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

    Input Specification:

    Each input file contains one test case.  For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive 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.

    Then 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.

    Output Specification:

    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.

    Sample Input:

    00100 6 4
    00000 4 99999
    00100 1 12309
    68237 6 -1
    33218 3 00000
    99999 5 68237
    12309 2 33218
    

    Sample Output:

    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1
    
    简单的模拟题,以空间换时间:
    #include <cstdio>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    const int NUM=100001;
    
    struct Node
    {
        int address;
        int data;
        int next;
    };
    
    Node nodes[NUM];
    vector<Node> list;
    int main()
    {
        int fnAddress,N,K;
        scanf("%d %d %d",&fnAddress,&N,&K);
        int i;
        for(i=0;i<N;++i)
        {
            Node node;
            scanf("%d %d %d",&node.address,&node.data,&node.next);
            nodes[node.address]=node;
        }
        int address=fnAddress;
        while(address!=-1)//去噪
        {
            list.push_back(nodes[address]);
            address=nodes[address].next;
        }
        int size=list.size();
        int round=size/K;
        int start,end;
        for(i=1;i<=round;++i)
        {
            start=(i-1)*K;
            end=i*K;
            reverse(list.begin()+start,list.begin()+end);
        }
        for(i=0;i<size-1;++i)
        {
            printf("%.5d %d %.5d
    ",list[i].address,list[i].data,list[i+1].address);
        }
        printf("%.5d %d %d
    ",list[i].address,list[i].data,-1);
        return 0;  
    }
    View Code
  • 相关阅读:
    本题要求两个给定正整数的最大公约数和最小公倍数。
    习题4-6 水仙花数 (20 分)
    习题4-5 换硬币 (20 分)
    习题4-4 特殊a串数列求和 (20 分)
    练习4-11 统计素数并求和 (20 分)
    一分钟玩转 Spring IoC
    vue 项目如何使用animate.css
    web前端自定义函数工具库
    React Context 理解和使用
    jQuery的链式编程风格
  • 原文地址:https://www.cnblogs.com/wwblog/p/3708838.html
Copyright © 2020-2023  润新知