天天看點

PAT (Advanced Level) Practise 1074 Reversing Linked List (25)

1074. Reversing Linked List (25)

時間限制

400 ms

記憶體限制

65536 kB

代碼長度限制

16000 B

判題程式

Standard

作者

CHEN, Yue

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<stack>
#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
const int INF = 0x7FFFFFFF;
const int maxn = 1e5 + 15;
int root, nt[maxn], v[maxn], n, k, x;
int f[maxn], tot;

int main()
{
  scanf("%d%d%d", &root, &n, &k);
  while (n--)
  {
    scanf("%d", &x);
    scanf("%d", &v[x]);
    scanf("%d", &nt[x]);
  }
  for (int i = root; i != -1; i = nt[i])
  {
    f[tot++] = i;
  }
  for (int i = 0; i + k <= tot; i += k)
  {
    for (int j = 0; j < k; j++)
    {
      if (i + j>i + k - j - 1) break;
      swap(f[i + j], f[i + k - j - 1]);
    }
  }
  for (int i = 0; i < tot; i++)
  {
    if (i < tot - 1) printf("%05d %d %05d\n", f[i], v[f[i]], f[i + 1]);
    else printf("%05d %d -1\n", f[i], v[f[i]]);
  }
  return 0;
}