/** * 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 #include 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; }