PAT (Basic Level) Practice (中文)1025 反转链表 (25分)
1025 反转链表 (25分)
给定一个常数 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 2
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
题解
晴神宝典中关于静态链表的知识
前面讲解的都是动态链表,即需要指针来建立结点之间的连接关系。而对有些问题来说,结点的地址是比较小的整数(例如5位的地址),这样就没有必要去建立动态链表,而应使用方便得多的静态链表
静态链表的实现原理是hash,即通过建立一个结构体数组,并令数组的下标直接表示结点的地址,来达到直接访问数组中的元素就能访问结点的效果。另外,由于结点的访问非常方便,因此静态链表是不需要头节点的。静态链表结点的定义的方法如下:
struct Node{
Elemtype data;
int next;
}node[ SIZE ];
一开始没看清题目,以为只用交换元素即可,重新审题才发现题目输出指明了要通过修改指针域来反转

输入样例一
00000 10 3
00000 1 11111
11111 2 22222
33333 3 -1
44444 4 55555
55555 6 66666
66666 7 77777
77777 8 88888
88888 9 99999
99999 10 -1
输出
33333 3 11111
11111 2 00000
00000 1 -1
样例中可能会给出两个-1,需要在开始反转之前按顺序遍历,计算有效结点的个数
输入样例二
00100 6 2
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出
12309 2 33218
12309 2 00100
00100 1 00000
00000 4 33218
33218 3 68237
68237 6 99999
99999 5 -1
这个例子检验的是反转的次数是否正确
代码
#include <stdio.h>
#define SIZE 100000
struct Node{
int data;
int next;
}node[SIZE];
void
createList( int n );
void
printList( int head );
void
reverse( int *head, int n, int k );
int
main( int argc, char **argv )
{
int address;
int head, n, k;
scanf("%d%d%d", &head, &n, &k);
createList( n );
for( address = head, n = 1; node[address].next != -1; address = node[address].next ){
/*
** 此循环的目的是判断有效结点的实际个数
*/
n++;
}
reverse( &head, n, k );
printList( head );
return 0;
}
void
createList( int n )
{
int i;
int address;
for( i = 0; i < n; i++ ){
scanf("%d", &address);
scanf("%d%d", &node[address].data, &node[address].next);
}
}
void
reverse( int *head, int n, int k )
{
int address, i;
int cnt;
int p = *head, tp, q;
int front = p;
int temp;
for( cnt = 0; cnt < n / k; cnt++ ){ //00100 1 12309
address = front; //12309 2 33218
for( i = 1; i < k; i++ ){ //33218 3 00000
/*
** 找逆置后的头结点
*/
address = node[address].next; //00000 4 99999
} //99999 5 68237
temp = front; //68237 6 -1
front = node[address].next;
if( cnt == 0 ){
*head = address;
/*
** 第一遍反转的头节点保留, 用于输出
*/
}else{
node[p].next = address;
}
p = temp;
tp = p;
q = node[p].next;
node[p].next = front; /*让front指向下一块区域*/
for( i = 1; i < k; i++ ){
/*
** 让p地址后面的k-1个结点反转
*/
int temp = node[q].next;
node[q].next = tp;
tp = q;
q = temp;
}
}
}
void
printList( int head )
{
int i = head;
while( i != -1 ){
printf("%05d %d ", i, node[i].data);
if( node[i].next == -1 ){
printf("-1"); //-1的输出和其他五位数的地址不同, 要单独处理
}else{
printf("%05d\n", node[i].next);
}
i = node[i].next;
}
}
PAT (Basic Level) Practice (中文)1025 反转链表 (25分)的更多相关文章
- PAT (Basic Level) Practice 1030 完美数列 分数 25
给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...
- 1025 反转链表 (25 分)C语言
题目描述 给定一个常数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 ...
- PAT (Advanced Level) Practice 1036 Boys vs Girls (25 分)
This time you are asked to tell the difference between the lowest grade of all the male students and ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
- PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642
PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642 题目描述: 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一 ...
- PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642
PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642 题目描述 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下 ...
- PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642
PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...
- PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642
PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642 题目描述: 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每 ...
- PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 凌宸1642
PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...
随机推荐
- CSS截取字段,让过长的字段结尾变成省略号(IE有效)
text-overflow:ellipsis;overflow:hidden;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transiti ...
- 移动端 uni-app 滑动事件 精确判断手指滑动方向
移动端根据手指滑动操作判断滑动方向 设计思路: 1.根据移动端touchstart和touchend方法获取手指触摸屏幕的开始坐标和结束坐标 2.根据两个坐标计算与水平方向的夹角 3.根据夹角判断当前 ...
- Python中的文件处理和数据存储json
前言:每当需要分析或修改存储在文件中的信息时,读取文件都很有用,对数据分析应用程序来说尤其如此. 例如,你可以编写一个这样的程序:读取一个文本文件的内容,重新设置这些数据的格式并将其写入文件,让浏览器 ...
- [第六篇]——云服务器之Spring Cloud直播商城 b2b2c电子商务技术总结
云服务器 云服务器(Elastic Compute Service, ECS)是一种简单高效.安全可靠.处理能力可弹性伸缩的计算服务. 云服务器管理方式比物理服务器更简单高效,我们无需提前购买昂贵的硬 ...
- 使用 elementUI 的表单进行查询,表单中只有一个文本框时,回车会自动触发表单的提交事件,导致页面的刷新。
使用elementUI的el-form组件进行查询时,当输入框仅有一项时,回车自动提交表单,浏览器会刷新页面: 原因:由于当表单只有一个文本框时,按下回车将会触发表单的提交事件, 从而导致页面刷新. ...
- 【转载】小心 int 乘法溢出!
C/C++ 语言里, 绝大部分平台上 int 类型是 32 位的, 无论你的操作系统是否是 64 位的. 而一些常用的函数, 如 malloc(), 它接受的参数是 size_t 类型: void * ...
- C++快读讲解
C++快读讲解 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') ...
- symfony2 数据库原生查询
1. 数组,没有键名 但只查询出第一个结果 $conn = $this->getDoctrine()->getConnection(); $data = $conn->fetchAr ...
- TP5模型开启事务
和Db开启事务类似,Db是静态方法 $userObj = new UserModel(); $userObj->startTrans(); try { $userObj->data($da ...
- disruptor笔记之一:快速入门
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...