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 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...
随机推荐
- JavaSE-Java基础面试题
重载与重写的区别 重载:本类中,方法名相同,参数列表不同,(参数类型.参数顺序.参数个数),返回值类型可以不同,访问修饰符可不同 重写:子类中,方法名相同,参数不能改,返回值类型一致或其子类,访问权限 ...
- MySQL中的seconds_behind_master的理解
通过show slave status查看到的Seconds_Behind_Master,从字面上来看,他是slave落后master的秒数,一般情况下,也确实这样,我们可以通过Seconds_Beh ...
- Spring系列之不同数据库异常如何抽象的?
前言 使用Spring-Jdbc的情况下,在有些场景中,我们需要根据数据库报的异常类型的不同,来编写我们的业务代码.比如说,我们有这样一段逻辑,如果我们新插入的记录,存在唯一约束冲突,就会返回给客户端 ...
- jq的slideToggle效果
slideToggle() 方法通过使用滑动效果(高度变化)来切换元素的可见状态. 如果被选元素是可见的,则隐藏这些元素,如果被选元素是隐藏的,则显示这些元素. 例子:一个简单的下拉菜单效果----& ...
- 洛谷P3768 简单的数学题解题报告
$$\begin{eqnarray}&\sum_{i=1}^{n}\sum_{j=1}^{n}ij\gcd(i,j)\\&\sum_{d=1}^{n}\sum_{i=1}^{n}\su ...
- ubuntu安装glusterFS
以2台服务器为例: node1: 172.18.1.10 node2: 172.18.1.20 1) 修改主机名,修改hosts文件添加IP地址映射 hostname node1/node2vim / ...
- Lombok中@Data注解的坑
开发遇到@Data注解的大坑 如果使用@Data注解,会默认重写hashcode和equals方法 那会遇到什么问题呢? 比如说: @Data public class DataTest { priv ...
- Nginx系列(7)- Nginx安装 | Linux
step-1 安装gcc 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: [root@localhost ~]# yum install ...
- Python爬虫之PySpider框架
概述 pyspider 是一个支持任务监控.项目管理.多种数据库,具有 WebUI 的爬虫框架,它采用 Python 语言编写,分布式架构.详细特性如下: 拥有 Web 脚本编辑界面,任务监控器,项目 ...
- golang 开发环境 配置 go语言 liteIDE
Mac: * 下载go安装包 go语言中文网 ** 通过源码编译安装需要先安装go1.4 wget https://studygolang.com/dl/golang/go1.10.3.src.tar ...