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分)的更多相关文章

  1. PAT (Basic Level) Practice 1030 完美数列 分数 25

    给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可能多的数构成一个完美数列. 输入格 ...

  2. 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 ...

  3. 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 ...

  4. PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)

    PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)   http://www.patest.cn/contests/pat-b-practise/1025 ...

  5. PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1078 字符串压缩与解压 (20 分) 凌宸1642 题目描述: 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一 ...

  6. PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1070 结绳 (25 分) 凌宸1642 题目描述 给定一段一段的绳子,你需要把它们串成一条绳.每次串连的时候,是把两段绳子对折,再如下 ...

  7. PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1065 单身狗 (25 分) 凌宸1642 题目描述: "单身狗"是中文对于单身人士的一种爱称.本题请你从上万人的大 ...

  8. PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1055 集体照 (25 分) 凌宸1642 题目描述: 拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每 ...

  9. PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 凌宸1642

    PAT (Basic Level) Practice (中文)1054 求平均值 (20 分) 题目描述 本题的基本要求非常简单:给定 N 个实数,计算它们的平均值.但复杂的是有些输入数据可能是非法的 ...

随机推荐

  1. maven下载出错

    求解

  2. 单片机学习(十二)1-Wire通信协议和DS18B20温度传感器

    目录 一.DS18B20 1. DS18B20简介 2. 电路原理图 3. 内部结构 内部完整结构框图 存储器结构 二.单总线(1-Wire BUS) 1. 单总线简介 2. 电路规范 3. 单总线的 ...

  3. Python - 执行cmd命令

    python操作cmd 我们通常可以使用os模块的命令进行执行cmd 方法一:os.system os.system(执行的命令) # 源码 def system(*args, **kwargs): ...

  4. AI:用软件逻辑做硬件爆款

    "我们的野心不止那么一点点." 百度集团副总裁.百度智能生活事业群组(SLG)总经理.小度CEO景鲲曾多次对外表达过这样的观点. 在2021年百度世界大会上,小度又一口气发布了四款 ...

  5. 对easyui-validatebox的验证类型的扩展

    easyui为我们提供了validatebox类型的组件,使用它可以完成自动验证,十分方便.要注意的是,easyui中的各个组件都是有继承关系的.通过查看api,textbox继承validatebo ...

  6. 三剑客之sed编辑器 基操

    目录: 一.sed编辑器 二.打印内容 三.使用地址 四.删除行 五.替换 六.插入 一.sed编辑器 sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流. sed ...

  7. 274 day04_Map,斗地主案例

      day04 [Map] 主要内容 Map集合 教学目标 [ ] 能够说出Map集合特点 [ ] 使用Map集合添加方法保存数据 [ ] 使用"键找值"的方式遍历Map集合 [ ...

  8. 【Python】python 2.7.16 x64 百度网盘

    倒霉官网下载太慢,下好了分享出来,也给自己留一个备份. 链接:点这里提取码:znaf PS: py2.7版本 for win 64位

  9. goto语法在PHP中的使用

    在C++.Java及很多语言中,都存在着一个神奇的语法,就是goto.顾名思义,它的使用是直接去到某个地方.从来代码的角度来说,也就是直接跳转到指定的地方.我们的PHP中也有这个功能,我们先来看看它是 ...

  10. dede调用数据时,字符串替换函数使用

    {dede:sql sql="SELECT typename,typedir,typeimg FROM #@__arctype where topid=30 limit 0,6"} ...