1-10 单链表分段逆转
- 分数:6
- 作者:陈越
- 单位:浙江大学
给定一个带头结点的单链表和一个整数K,要求将链表中的每K个结点做一次逆转。例如,单链表 1→2→3→4→5→6 与 K=3 结合,结果为 3→2→1→6→5→4;若 K=4,则结果为 4→3→2→1→5→6(剩余不足K个的结点保持原顺序)。
函数接口定义
void K_Reverse( List L, int K );
其中List结构定义如下:
typedef struct Node *PtrToNode;
struct Node {
ElementType Data; /* 存储结点数据 */
PtrToNode Next; /* 指向下一个结点的指针 */
};
typedef PtrToNode List; /* 定义单链表类型 */
L:给定的带头结点单链表;K:每段逆转的结点长度(K≥1);- 函数功能:按要求分段逆转链表,直接修改原链表(无返回值)。
裁判测试程序样例
#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;
}
/* 你的代码将被嵌在这里 */
输入样例
6
1 2 3 4 5 6
4
输出样例
4 3 2 1 5 6
限制条件
- 代码长度限制:16 KB
- 时间限制:400 ms
- 内存限制:64 MB
- 栈限制:8192 KB
解析
static int getLength( List L ){
int len = 0;
L = L->Next;
while(L){
len++;
L = L->Next;
}
return len;
}
void K_Reverse( List L, int K ){
int flag = 0; // 当前改造起始位置
int len = getLength(L);
PtrToNode cur = L->Next; // 遍历指针
PtrToNode later = NULL;
PtrToNode head = L; // 定义一个虚拟头结点
while(flag + K <= len){
PtrToNode tail = cur; // 提前存第一段反转后的尾指针
// k区间反转操作
for(int i = 0; i < K; i++){
later = cur->Next;
cur->Next = head->Next;
head->Next = cur;
cur = later;
}
// 更新虚拟头结点
head = tail;
head->Next = cur;
flag += K;
}
}
569

被折叠的 条评论
为什么被折叠?



