赣州瑞金网站建设,百度收录刷排名,外贸网站,wordpress页面中添加小工具给定一个带头结点的单链表和一个整数K#xff0c;要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K3#xff0c;你需要将链表改造成 3→2→1→6→5→4#xff1b;如果 K4#xff0c;则应该得到 4→3→2→1→5→6。 函数接口定义#xff1a;
v…给定一个带头结点的单链表和一个整数K要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K3你需要将链表改造成 3→2→1→6→5→4如果 K4则应该得到 4→3→2→1→5→6。 函数接口定义
void K_Reverse( List L, int K ); 其中List结构定义如下
typedef struct Node *PtrToNode;
struct Node {ElementType Data; /* 存储结点数据 */PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */L是给定的带头结点的单链表K是每段的长度。函数K_Reverse应将L中的结点按要求分段逆转。
裁判测试程序样例
#include stdio.h
#include stdlib.htypedef 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;
}/* 你的代码将被嵌在这里 */
输入样例 6 1 2 3 4 5 6 4 输出样例 4 3 2 1 5 6 void K_Reverse( List L, int K )
{List H L;PtrToNode p,q,w,t;int num;while(H)//!!! H 表示当前可能要逆置的片段的头结点{num 0;p H;while(numKp-Next)//!!!找到第 K 个数据结点 p{num;p p-Next;}if(numK)//!不足K 个不用逆置return ;else{t H-Next;
/**t 保存第一个数据结点即逆置后的尾结点
也是下一次的头结点 H 的值 */ w p-Next;//!保存接下来的链表片段p-Next NULL;//!把即将要逆置的片段与后面的片段一刀两断p H-Next;//!要逆置片段的第一个数据结点while(p)//!因为一刀两断了所以不会影响后面的只操作这 K 个结点{q p;p p-Next;//!!!逆置进行中 q-Next H-Next;H-Next q;}t-Next w;
//!将原来的第一个数据结点 t 即现在第K个数据结点,将之前一刀两断的接到尾部H t;//!更新下次可能要逆置片段的头结点 }}}其实思路挺简单的但是当时脑子可能不太清醒没实现对以上是脑子清醒后写的。