给定一个常数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> struct node { int add; int num; int next; }; int main() { int num[100000], next[100000]; int start, n, k; int length=0; scanf("%d %d %d", &start, &n, &k); node *nodeList = (node *) malloc (n * sizeof(node)); int i, j, add; for(i = 0; i < n; i++) { scanf("%d", &add); scanf("%d %d", &num[add], &next[add]); } for(i = start, j = 0; i != -1 && j < n; i=next[i], j++) { nodeList[j].add = i; nodeList[j].num = num[i]; nodeList[j].next = next[i]; length++; } if(length < k) { for(i = 0; i < length; i++) { if(i < n -1) printf("%05d %d %05d\n", nodeList[i].add, nodeList[i].num, nodeList[i].next); else printf("%05d %d %d\n", nodeList[i].add, nodeList[i].num, nodeList[i].next); } } else { int reversrtime = length / k; for(i = 0; i < reversrtime; i++) { for(j = (i+1)*k-1; j >= i*k; j--) { if(j == i * k) { if(i < reversrtime - 1) printf("%05d %d %05d\n", nodeList[j].add, nodeList[j].num, nodeList[(i+2)*k-1].add); else if(length % k != 0 && i == reversrtime - 1) printf("%05d %d %05d\n", nodeList[j].add, nodeList[j].num, nodeList[(i+1)*k].add); else printf("%05d %d -1\n", nodeList[j].add, nodeList[j].num); } else printf("%05d %d %05d\n", nodeList[j].add, nodeList[j].num, nodeList[j-1].add); } } if(length % k != 0) { for(j = reversrtime*k; j < length; j++) { if(j < length - 1) printf("%05d %d %05d\n", nodeList[j].add, nodeList[j].num, nodeList[j].next); else printf("%05d %d -1\n", nodeList[j].add, nodeList[j].num); } } } return 0; }