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\n",list[i].address,list[i].data,list[i+1].address);

    }

    printf("%.5d %d %d\n",list[i].address,list[i].data,-1);

    return 0;  

}
View Code

 

你可能感兴趣的:(list)