ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
C [TOC] ### 题目描述 链表反转: 给定一个常数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> int main() { int head=0, n=0, v=0; scanf("%d%d%d", &head, &n, &v); int address=0, data=0, next=0, prior=0, ppp=0; int node[100000][3]={0};//0-prior 1-Data 2-Next for(int i=0; i<n; i++) { scanf("%d%d%d", &address, &data, &next); node[address][1]=data; node[address][2]=next; } next=head;//修补前指针 prior=head; for(int i=0; i<n; i++) { node[next][0]=prior; prior=next; next=node[next][2]; while(next<0) { n=i+1; break; } } ppp=next;//node[next][0]=prior; prior=-1; next=head; if(v<=1) v=n+1; for(int i=0; i<n;) { next=head; if(i+v <= n) { for(int j=i; j<i+v; j++) { if(j==i) next=head; else next=node[next][2]; } head=node[next][2]; for(int j=i; j<i+v; j++) { if(j) printf(" %05d\n", next); printf("%05d %d", next, node[next][1]); next=node[next][0]; } } else { for(int j=i; j<n; j++) { if(j) printf(" %05d\n", next); printf("%05d %d", next, node[next][1]); next=node[next][2]; } } i+=v; } printf(" %d", ppp); return 0; } ```