基础实验3-2.2 单链表分段逆转 (25 分) (C语言)
给定一个带头结点的单链表和一个整数
K
K
K,要求你将链表中的每
K
K
K个结点做一次逆转。例如给定单链表
1
→
2
→
3
→
4
→
5
→
6
1→2→3→4→5→6
1→2→3→4→5→6 和
K
=
3
K=3
K=3,你需要将链表改造成
3
→
2
→
1
→
6
→
5
→
4
3→2→1→6→5→4
3→2→1→6→5→4;如果
K
=
4
K=4
K=4,则应该得到
4
→
3
→
2
→
1
→
5
→
6
4→3→2→1→5→6
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.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;
}
输入样例1:
6
1 2 3 4 5 6
4
输出样例1:
4 3 2 1 5 6
二、题解
c代码
void K_Reverse( List L, int K ) {
int num = 0;
for (List p = L -> Next; p ; p = p -> Next) num++;
List new, old, tmp, s, head = L;
for (int i = 1; i <= num / K; i++) {
new = head -> Next;
old = new -> Next;
s = new;
int j = K - 1;
while(j--) {
tmp = old -> Next;
old -> Next = new;
new = old, old = tmp;
}
head -> Next = new;
s -> Next = old;
head = s;
}
}
|