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 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...
随机推荐
- 在已有Win7/10系统电脑中加装Ubuntu18.04(安装双系统)
准备一台有Win7/10的电脑. 为Ubuntu预留硬盘空间.最好在硬盘最后保留一个空闲分区.(Ubuntu会自动安装到后面的空闲分区) 用Universal USB Installer制作安装盘(U ...
- Ubuntu16.04 Linux 下无痛安装、配置Gogs
本文在Win7+VMware的ubuntu 16.04中测试,安装Gogs,Install from binary. 准备工作: sudo apt-get install git sudo addus ...
- Servlet学习笔记(二)之Servlet路径映射配置、Servlet接口、ServletConfig、ServletContext
Servlet路径映射配置 要使Servlet对象正常的运行,需要进行适当的配置,以告诉Web容器哪个请求调用哪个Servlet对象处理,对Servlet起到一个注册的作用.Servlet的配置信息包 ...
- GUI常用监听事件
概念 对鼠标.键盘等一系列事件做出相应的反馈 事件监听 //创建监听事件 public class Demo { public static void main(String[] args) { Fr ...
- 理解ASP.NET Core - [03] Dependency Injection
注:本文隶属于<理解ASP.NET Core>系列文章,请查看置顶博客或点击此处查看全文目录 依赖注入 什么是依赖注入 简单说,就是将对象的创建和销毁工作交给DI容器来进行,调用方只需要接 ...
- 设置 ajax 同步获取数据
问题 在处理DataTable的render进行列表渲染的时候发现通过ajax发送请求,返回的值并不正确. {"data":"id","render& ...
- Jenkins(4)- 在centos7.x下完全卸载Jenkins
如果想从头学起Jenkins的话,可以看看这一系列的文章哦 https://www.cnblogs.com/poloyy/category/1645399.html 先关闭tomcat ./shutd ...
- openswan框架和编译时说明
刚开始学习openswan项目代码时,自己尝试了在虚拟机上编译.安装.运行openswan代码,由于当时刚开始学习openswan代码,因此对于其构成并不清楚,在编译.运行过程中有了问题,基本是通过百 ...
- openswan协商流程之(三):main_inR1_outI2
主模式第三包:main_inR1_outI2 1. 序言 main_inR1_outI2()函数是ISAKMP协商过程中第三包的核心处理函数的入口.这里我们主要说明main_inR1_outI2的函数 ...
- tornado2.2安装教程
最近要用到vxworks 系统,所以避免不了要安装tornado 软件,进行相关的开发. 自己在安装过程中遇到了点点问题,这里记录下来,免得以后再次安装时遇到同样的问题. 1. 首先提供一个tor ...