1165 Block Reversing (25 分)
Given a singly linked list L. Let us consider every K nodes as a block (if there are less than K nodes at the end of the list, the rest of the nodes are still considered as a block). Your job is to reverse all the blocks in L. For example, given L as 1→2→3→4→5→6→7→8 and K as 3, your output must be 7→8→4→5→6→1→2→3.
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 size of a block. 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.
思路
1.用数组来模拟链表,从头到尾遍历链表,遍历以k个节点为一组,将本组最后一个节点的指针指向上一组的第一个节点。
坑点
1.有些节点并不在所给的头结点的链表上,所以只能对有效节点进行统计和输出。
Sample Input:
00100 8 3
71120 7 88666
00000 4 99999
00100 1 12309
68237 6 71120
33218 3 00000
99999 5 68237
88666 8 -1
12309 2 33218
Sample Output:
71120 7 88666
88666 8 00000
00000 4 99999
99999 5 68237
68237 6 00100
00100 1 12309
12309 2 33218
33218 3 -1
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int nex[100005];
int main()
{
memset(nex, -1, sizeof(nex));
int head; cin >> head;
int n, k; cin >> n >> k;
for (int i = 1; i <= n; ++i)
{
int now; cin >> now;
cin >> a[now];
cin >> nex[now];
}
int cnt = 0;
int pre = -1;
int ppre = -1;
int now = head;
while(1)
{
if (now == -1)break;
int nx = nex[now];
if (cnt%k==0)
{
ppre = pre;
pre = now;
}
if(cnt%k==k-1||nx==-1)
{
nex[now] = ppre;
}
now = nx;
cnt++;
}
for (int i = pre; i != -1; i = nex[i])
{
if (nex[i] == -1)printf("%05d %d %d\n", i, a[i], nex[i]);
else printf("%05d %d %05d\n", i, a[i], nex[i]);
}
}