给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。
输入样例: 6 1 2 3 4 5 6 4 输出样例: 4 3 2 1 5 6
#include <stdio.h> #include <stdlib.h> typedef int ElementType; typedef struct Node *PtrToNode; struct Node{ ElementType Data; /* 存储结点数据 */ PtrToNode Next; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ List ReadInput(); /* 裁判实现,细节不表 */ void PrintList( List L ); /* 裁判实现,细节不表 */ void K_Reverse( List L, int K ); int main() { List L; int K; L = ReadInput(); scanf("%d", &K); K_Reverse( L, K ); PrintList( L ); return 0; } /* 你的代码将被嵌在这里 */ List ReadInput() { int n,x; scanf("%d",&n); List head,p,s; for(int i=1;i<=n;i++) { s=(List )malloc(sizeof(struct Node)); scanf("%d",&s->Data); s->Next=NULL; if(i==1) { head=s; p=head; } else { p->Next=s; p=s; } } return head; } void PrintList( List L ) { while(L!=NULL) { printf("%d ",L->Data); L=L->Next; } } void K_Reverse( List L, int K ) { L=L->Next; int cnt=0; List p1=L,p2=L; while(p1!=NULL) { cnt++; p1=p1->Next; } p1=L;//p1返回到头结点 //得到节点的总数量cnt int f=cnt/K;//需要翻转f次 cnt=0; int a[K+1]; int t=1; while(cnt<f) { t=1; while(t<=K&&p1!=NULL) { a[t]=p1->Data; p1=p1->Next; t++; } t=1; while(p2!=NULL&&t<=K) { p2->Data=a[K+1-t]; p2=p2->Next; t++; } p2=p1; cnt++; } }