PAT Advanced 1074 Reversing Linked List (25) [链表]
题目
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by
-1.Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 6 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218
Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
题目分析
已知N个结点,以K为步长,反转链表
解题思路
- 定义结点,使用数组存储N个结点,使用order属性记录链表中结点出现序号
- 将链表分为n/k个段,对每个段进行反转
2.1 每个节点的next即为反转后的下一个结点地址
2.2 每个段最后一个节点的特殊处理:next为下一个段反转前最后一个结点
2.3 最后一个段的处理- 若n%k==0,说明n可以正好分为n/k个段,最后一个段反转,并将最后一个节点置为-1
- 若n%k!=0,说明最后一段小于k,开始下标为n/k*k,不需要反转,顺序打印,并将最后一个结点置为-1
知识点
- 将n个结点分为n/k个段,最后一段开始下标为n/k*k(下标从0开始)
- 链表反转,不一定非要对链表进行反转(即:更换每个结点next值),可以使用本题思想反向打印的办法
Code
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=100010;
struct node {
int adr;
int data;
int next;
bool flag=false;//初始化为false
int order=maxn;
} nds[maxn];
bool cmp(node &n1,node &n2) {
return n1.order<n2.order;
}
int main(int argc,char *argv[]) {
int hadr,n,k,adr;
scanf("%d %d %d",&hadr,&n,&k);
for(int i=0; i<n; i++) {
scanf("%d",&adr);
scanf("%d %d",&nds[adr].data,&nds[adr].next);
nds[adr].adr=adr;
}
int count=0;
for(int i=hadr; i!=-1; i=nds[i].next) {
// nds[i].flag=true;
nds[i].order=count++;
}
sort(nds,nds+maxn,cmp);
n=count;
// for(int i=0; i<n; i++) {
// printf("%05d %05d %05d\n",nds[i].adr,nds[i].data,nds[i].next);
// }
for(int i=0; i<n/k; i++) {
for(int j=(i+1)*k-1; j>i*k; j--) {
printf("%05d %d %05d\n",nds[j].adr,nds[j].data,nds[j-1].adr);
}
printf("%05d %d",nds[i*k].adr,nds[i*k].data);
if(i<n/k-1) {
printf(" %05d\n",nds[(i+2)*k-1].adr);
} else {
if(n%k==0)printf(" -1\n"); //正好可以分为n/k块,并且打印最后一块
else {
printf(" %05d\n",nds[(i+1)*k].adr);
for(int j=n/k*k; j<n; j++) {
printf("%05d %d",nds[j].adr,nds[j].data);
if(j<n-1)printf(" %05d\n",nds[j+1].adr);
else printf(" -1\n");
}
}
}
}
return 0;
}
PAT Advanced 1074 Reversing Linked List (25) [链表]的更多相关文章
- PAT 甲级 1074 Reversing Linked List (25 分)(链表部分逆置,结合使用双端队列和栈,其实使用vector更简单呐)
1074 Reversing Linked List (25 分) Given a constant K and a singly linked list L, you are supposed ...
- PAT甲级1074 Reversing Linked List (25分)
[程序思路] 先根据地址按顺序读入节点,入栈,当栈里的元素个数等于k时全部出栈,并按出栈顺序保存,最后若栈不为空,则全部出栈并按出栈的稀饭顺序保存,最后输出各节点 注意:输入的节点中有可能存在无用节点 ...
- PAT甲题题解-1074. Reversing Linked List (25)-求反向链表
题意说的很清楚了,这种题的话,做的时候最好就是在纸上自己亲手模拟一下,清楚一下各个指针的情况, 这样写的时候就很清楚各个指针变量保存的是什么值. PS:一次AC哈哈,所以说自己动手在纸上画画还是很有好 ...
- PAT (Advanced Level) 1074. Reversing Linked List (25)
简单题. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #in ...
- PAT 1074. Reversing Linked List (25)
Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elem ...
- 【PAT甲级】1074 Reversing Linked List (25 分)
题意: 输入链表头结点的地址(五位的字符串)和两个正整数N和K(N<=100000,K<=N),接着输入N行数据,每行包括结点的地址,结点的数据和下一个结点的地址.输出每K个结点局部反转的 ...
- PAT A1133 Splitting A Linked List (25) [链表]
题目 Given a singly linked list, you are supposed to rearrange its elements so that all the negative v ...
- 1074. Reversing Linked List (25)
模拟题,注意当k == 1 与 k == n时情况 #include <stdio.h> #include <string.h> #include <iostream&g ...
- PAT 1074 Reversing Linked List[链表][一般]
1074 Reversing Linked List (25)(25 分) Given a constant K and a singly linked list L, you are suppose ...
随机推荐
- 利用ThoughtWorks.QRCode生成二维码
一.项目添加ThoughtWorks.QRCode.dll和System.Drawing.dll的引用 二.创建二维码公共处理类(QRCodeHandler.cs) /// <summary&g ...
- 实验吧-杂项-你知道他是谁吗?(转盘密码、NTFS数据流检测及导出)
刚看到的时候听懵,没注意到重点,其实很多时候题目中的细节就是给我们线索的,所以审题和思考是很重要的. 在没做到点上的是,也做了一点努力,没有效果,科普一下这个人((*^▽^*))图片上是托马斯.杰斐逊 ...
- Inception Score
转载 https://www.jiqizhixin.com/articles/2019-01-10-18 全面解析Inception Score原理及其局限性 https://blog.csdn ...
- Apache nifi 第二篇(小白初试) nifi数据对接流程初次尝试
一.准备工作 1.官网下载nifi 2.上传到linux随便哪里把,因为nifi是用java写的,所以首先要保证你的linux装了jdk 其次保证系统在装了zookeeper,因为nifi是一个分布 ...
- Day 13:File类的常用方法
路径问题: 绝对路径: 该文件在硬盘上 的完整路径.绝对路径一般都是以盘符开头的. 相对路径: 相对路径就是资源文件相对于当前程序所在的路径. . 当前路径 .. 上一级路径 注意: 如果程 ...
- (排序)P1068 分数线划定
题解: 需要注意的是,快排完之后并不是按照编号从小到大的顺序输出 #include<iostream>using namespace std;int r=0;void swap(int & ...
- ES6中新增let命令使用方法
在ES6中新增了let命令,该命令的用法与var 类似,但是所声明的变量只能在let命令所在的代码块(最接近let 命令的大括号内)中有效果.但是let 又有一些不同于var 的特性. 1.let定 ...
- 2.2 学习总结 之 servlet 的两次抽取
说在前面 昨天 完成了文件上出的学习和实践 今天 学习servlet的两次抽取,以加快编写工程的速度 一.servlet 抽取的原因: 刚刚学习使用servlet写后台,往往只使用一个servlet来 ...
- windows driver 映射小文件
NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING(L"\\??\\C:\\网络调试工具.exe"); ...
- Standard Aras Dialogs
In a another blog post, we covered how to open dialogs within Aras Innovator using custom forms and ...