Files
PAT/PATBasic/1025.c
T
2017-04-07 22:33:45 +08:00

99 lines
3.5 KiB
C

/**
* 1025. 反转链表 (25)
*
* 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为
* 1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为
* 4→3→2→1→5→6,即最后不到K个元素不反转。
*
* 输入格式:
*
* 每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数
* 正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是
* 5位非负整数,NULL地址用-1表示。
*
* 接下来有N行,每行格式为:
* Address Data Next
*
* 其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。
*
* 输出格式:
*
* 对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
*
* 输入样例:
* 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
*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int A, N, K;
scanf("%d %d %d", &A, &N, &K);
int **nodes = (int**)malloc(N * sizeof(int*));
/* read */
for(int i = 0; i < N; i++){
nodes[i] = (int*)malloc(3 * sizeof(int)); /* Address, Data, Next */
scanf("%d %d %d", nodes[i], nodes[i] + 1, nodes[i] + 2);
}
/* link the list */
int *temp;
for(int i = 0; i < N - 1; i++){
for(int j = i; j < N; j++){
if(nodes[j][0] == (i ? nodes[i - 1][2] : A)){
temp = nodes[i];
nodes[i] = nodes[j];
nodes[j] = temp;
if(nodes[i][2] == -1){ /* there could be useless nodes ... */
N = i + 1; /* AND */
} /* NO :-( */
break; /* ONE */
} /* TOLD */
} /* ME */
} /* BEFORE */
/* !!!! */
/* reverse the list */
int **p = nodes;
for(; N >= K; N -= K, p += K){ /* every K nodes */
for(int i = K - 1; i >= 0; i--){
printf("%05d %d ", p[i][0], p[i][1]);
if(i == 0){ /* last node in K nodes */
if(N - K == 0){ /* this is the last node */
printf("-1\n");
} else if(N - K >= K){ /* point to next K nodes */
printf("%05d\n", (*(p + 2 * K - 1))[0]);
} else { /* there is less then K nodes left */
printf("%05d\n", (*(p + K))[0]);
}
} else { /* not last in K nodes */
printf("%05d\n", p[i - 1][0]);
}
}
}
for(; N; p++, N--){ /* last nodes if there is any */
printf("%05d %d ", (*p)[0], (*p)[1]);
if(N > 1){ /* not last node */
printf("%05d\n", (*p)[2]);
} else { /* last node */
printf("-1\n");
}
}
return 0;
}