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. 学习 Webpack5 之路(优化篇)

    一.前言 从 0 到 1 学习的朋友可参考前置学习文章: 学习 Webpack5 之路(基础篇) 学习 Webpack5 之路(实践篇) 前置文章 学习 Webpack5 之路(基础篇) 对 webp ...

  2. Mysql索引最佳实践笔记0524

    #mysql5.7 innodb默认存储引擎 一.关于索引二.最佳实践三.避坑实践 一.关于索引 1.索引的作用 -提高查询效率 -数据分组.排序 -避免回表查询 -优化聚集查询 -用于多表join关 ...

  3. css 文字超出俩行省略号显示

    .center-titles{ overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: ...

  4. JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类

    JDK1.8源码阅读笔记(2) AtomicInteger AtomicLong AtomicBoolean原子类 Unsafe Java中无法直接操作一块内存区域,不能像C++中那样可以自己申请内存 ...

  5. nacos配置中心模块详解

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 配置中心 业务上的配置,功能开关,服务治理上对弱依赖的降级,甚至数据库的密码等,都可能用到动态 ...

  6. spark集群的构建,python环境

    个人笔记,问题较多 符号说明 [] 表示其中内容可以没有 su [root] 获取root权限 vi /etc/sudoers 1.点击I或Insert获得插入权限 2.在root ALL=(ALL) ...

  7. LVS+keepalived集群

    一.Keepalived工具介绍专为LVS和HA设计的一款健康检查工具 支持故障自动切换(Failover) 支持节点健康状态检查(Health Checking) 官方网站:http://www.k ...

  8. 放码来战!HMS Core线上Codelabs挑战赛正式开始

    亲爱的开发者,在1024程序员节即将到来之际,HMS Core准备了一场线上Codelabs挑战赛,现向你发出诚挚邀请,希望你能将新奇的想法和对产品的思考融入代码,用技术与世界对话. HMS Core ...

  9. request内部转发Demo

    // 转发的Demo1 import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import ja ...

  10. java 笔记一些

    面象对的umv 视图示例: 用户  银行  帐户  怎么关联 帐户代码: 文件命名 Account package com.atuigu.exer4; import org.omg.CORBA.PUB ...