PAT 1025 反转链表
PAT (Basic Level) Practise 1025
1、 问题概述
- 链接:https://www.patest.cn/contests/pat-b-practise/1025
- 概述: 给定一个常数K以及一个单链表L,将L中每K个结点反转。最后不到K个元素不反转。
2、 解题思路
- 课上听了栋哥说可以把需要反转的部分从原位置拆了,再重新插入链表最尾部。感觉这样的想法很棒!
- 大概是这样的意思

- 然后就按这样的想法写了一下~(单向链表感觉不好操作...后来改用了双向的...)
3、 代码
#include<stdio.h>
#include<iostream>
#include<string>
using namespace std;
struct link {
int address;
int next;
int data;
struct link *nxt;//指向下一个
struct link *last;//指向上一个
};
struct link l[100100],Lk[100100];
struct link *head;
int main() {
head = (struct link*)malloc(sizeof(struct link));
int n, k;
int i, j;
scanf_s("%d%d%d", &l[0].address, &n, &k);
l[0].nxt = &l[n + 1];
l[n + 1].nxt = NULL;
for (i = 1; i <= n; i++) {
scanf_s("%d%d%d", &l[i].address, &l[i].data, &l[i].next);
//找出第一个节点
if (l[i].address == l[0].address) {
l[i].nxt = l[0].nxt;
l[0].nxt = &l[i];
head = &l[i];
}
}
//整理链表
while (head->next != -1) {
for (i = 1; i <= n; i++) {
if (l[i].address == head->next) {
l[i].nxt = head->nxt;
head->nxt = &l[i];
head = &l[i];
break;
}
}
}
//重新排列链表
head = &l[0];
for (i = 0; head->nxt != NULL; i++) {
//连接新链表
if (i != 0) {
Lk[i].last = &Lk[i - 1];
Lk[i - 1].nxt = &Lk[i];
}
//新链表数据转移
Lk[i].address = head->address;
Lk[i].data = head->data;
head = head->nxt;
}
int length = i - 1;
Lk[length].nxt = &Lk[i];
Lk[i].last = &Lk[length];
Lk[i].data = i;
//链表不需要反转
if (k == 1 || k > length) {
head = Lk[0].nxt;
printf("%05d %d", head->address, head->data);
head = head->nxt;
while (head->nxt != NULL) {
printf(" %05d\n%05d %d", head->address, head->address, head->data);
head = head->nxt;
}
printf(" -1\n");
return 0;
}
bool islength = false;
//反转
head = &Lk[length];
for (j = 1; j*k <= length; j++) {
for (i = k*j; i > k*(j - 1); i--) {
//全反转
if (k == length&&!islength) {
head = head->last;
islength = true;
}
//从原序列移除
Lk[i].nxt->last = Lk[i].last;
Lk[i].last->nxt = Lk[i].nxt;
//插入链表尾部
Lk[i].last = head;
head->nxt->last = &Lk[i];
Lk[i].nxt = head->nxt;
head->nxt = &Lk[i];
head = &Lk[i];
}
}
//剩余不用反转部分
for (i = (j - 1)*k + 1; i <= length; i++) {
Lk[i].nxt->last = Lk[i].last;
Lk[i].last->nxt = Lk[i].nxt;
Lk[i].last = head;
head->nxt->last = &Lk[i];
Lk[i].nxt = head->nxt;
head->nxt = &Lk[i];
head = &Lk[i];
}
//输出
head = Lk[0].nxt;
printf("%05d %d", head->address, head->data);
head = head->nxt;
while (head->nxt != NULL) {
printf(" %05d\n%05d %d", head->address, head->address, head->data);
head = head->nxt;
}
printf(" -1\n");
return 0;
}
4、 问题与解决
- 在链接新链表的时候,最开始都连到了原链表...新链表之间没有连接起来(⊙ˍ⊙)找了很久不知道错在哪里。最后想起栋哥说不会的时候就画图,果然,才模拟新链表第一个节点的时候就发现了问题。
- 然后根据大神提醒,手动加头尾两个边界比较不容易出错 ( ̄︶ ̄)
5、 最后
- 其实,这代码并没有AC (⊙ˍ⊙) 有一个点超时了...

- 大概能猜到是重新按顺序排列链表那边耗了很多时间,不过实在不会改了orz
- 我觉得吧,对于一个全部用数组A掉上学期C语言上机的指针题以及这学期程序设计语言综合设计的指针题的人,做到这样已经很棒了(不要脸hhh)
- 现在应该能算是勉强会用链表了吧 0 0 不过...还是好想用数组啊

- 真的超级赞的呀~又快又好找bug
PAT 1025 反转链表的更多相关文章
- PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)
1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4, ...
- PAT——1025. 反转链表
给定一个常数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,即最后 ...
- PAT 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,即最后 ...
- PAT乙级真题及训练题 1025. 反转链表 (25)
PAT乙级真题及训练题 1025. 反转链表 (25) 感觉几个世纪没打代码了,真是坏习惯,调了两小时把反转链表调出来了,心情舒畅. 这道题的步骤 数据输入,数组纪录下一结点及储存值 创建链表并储存上 ...
- PAT (Basic Level) Practise (中文)-1025. 反转链表 (25)
PAT (Basic Level) Practise (中文)-1025. 反转链表 (25) http://www.patest.cn/contests/pat-b-practise/1025 ...
- PAT乙级 1025. 反转链表 (25)
1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数K以及一个单链表L,请 ...
- 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→ ...
- PAT-乙级-1025. 反转链表 (25)
1025. 反转链表 (25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定一个常数K以及一个单链表L,请 ...
- PAT (Basic Level) Practice 1025 反转链表 分数 25
给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...
随机推荐
- [总结]其他杂项数学相关(定理&证明&板子)
目录 写在前面 一类反演问题 莫比乌斯反演 快速莫比乌斯变换(反演)与子集卷积 莫比乌斯变换(反演) 子集卷积 二项式反演 内容 证明 应用举例 另一形式 斯特林反演 第一类斯特林数 第二类斯特林数 ...
- 并发编程之 ConcurrentLinkedQueue 源码剖析
前言 今天我们继续分析 java 并发包的源码,今天的主角是谁呢?ConcurrentLinkedQueue,上次我们分析了并发下 ArrayList 的替代 CopyOnWriteArrayList ...
- React多页面应用脚手架-v1.3.0
react-multi-page-app是一个基于react和webpack的多页面应用架构,通过编译生成对应目录结构清晰的静态页面,实现多页面便捷开发维护.1.3.0 版本对项目整体做了一个全面的升 ...
- 让 VS2010 支持 HTML5 和 CSS3.0
现在的热门话题之一是HTML5 和 CSS3.好的, 它们都很时髦,它们也必然会影响网络开发的未来. 让我们尝尝鲜,花点时间安装设置一下,尽快让Visual Studio2010支持HTML5 和 C ...
- 无责任Windows Azure SDK .NET开发入门(二):使用Azure AD 进行身份验证
<編者按>本篇为系列文章,带领读者轻松进入Windows Azure SDK .NET开发平台.本文为第二篇,将教导读者使用Azure AD进行身分验证.也推荐读者阅读无责任Windows ...
- Java基础——JSP(二)
一.JSP隐式对象概述 为了简化jsp表达式和脚本片断代码的编写,JSP一共提供了9个预先定义的变量,这些变量也称为隐式对象或内置对象. 在 jsp生成的Servlet源码中,有如下声明: publi ...
- Spring全家桶系列–SpringBoot与Mybatis结合
//本文作者:cuifuan Mybatis 是一个持久层ORM框架,负责Java与数据库数据交互,也可以简易理解为中介,相对于它,还有个中介是hibernate,不过在mybatis中sql语句的灵 ...
- JSON: jasckson 字段 过滤
有这样一个场景存在一个model类如果User,这里省略了getter/setter方法 class User { String name; String uuid; Long created; Lo ...
- python网络爬虫抓取动态网页并将数据存入数据库MySQL
简述以下的代码是使用python实现的网络爬虫,抓取动态网页 http://hb.qq.com/baoliao/ .此网页中的最新.精华下面的内容是由JavaScript动态生成的.审查网页元素与网页 ...
- Vue知识点(面试常见点)
v-bind和v-model的区别 1.v-bind用来绑定数据和属性以及表达式,缩写为':' 2.v-model使用在表单中,实现双向数据绑定的,在表单元素外使用不起作用 什么是 mvvm? MVV ...