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,即最后不到K个元素不反转。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 10^5^)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:

00100 6 4
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
  题解:这道题刚开始有两个测试点过不去一直纠结,看了好长时间,才发现是每k个都要反转,
也就是给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4,开始时候一直没有注
意到这个,导致有两个测试点过不去。思路的话,使用两个数组,一个数组来存放每个节点的地址,
一个数组来存放每个节点的下一个地址,再遍历一次链表得出节点个数(可能有节点不在其中),
同时将节点按照链表顺序存储在一个新数组里,每次对k个节点使用reverse来进行倒置,最后输出
即可。
知识点复习:
  ① reverse,用于反转容器中的元素,其两个参数分别为反转开始的位置和反转结束的位置
(如反转string a, 即为 reverse(a.begin(),a.end()),该函数存在于头文件#include<algorithm>下。
  ② printf("%05d",a);使用"%05d"可以使a按照5位输出,不足5位在前面补0。
  ③ memset(),有三个参数,分别是开始位置,将该范围内的数据赋的值(一般为0,用作数据初始化),长度大小。
该函数在#include<cstring>下,写法为 memset(a,0,N);
代码如下:
 #include <iostream>
#include <algorithm>
using namespace std;
int main() {
int first, k, n, temp;
cin >> first >> n >> k;
int data[], next[], list[];
for (int i = ; i < n; i++) {
cin >> temp;
cin >> data[temp] >> next[temp];
}
int sum = ;
while (first != -) {
list[sum++] = first;
first = next[first];
}
for (int i = ; i < (sum - sum % k); i += k)
reverse(begin(list) + i, begin(list) + i + k);
for (int i = ; i < sum - ; i++)
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + ]);
printf("%05d %d -1", list[sum - ], data[list[sum - ]]);
return ;
}

下面是我刚开始理解错题意的错误代码,希望对大家有一定借鉴意义,或者也可以按照我这个思路自己写一个reverse

 #include<iostream>
#include<cstring>
#define N 1000005 using namespace std; int a[N], b[N]; int main()
{
memset(a,,N);
memset(b,,N);
int head, n, k, address, data, next, number = , p, q, num = ;
scanf("%d %d %d",&head, &n, &k);
while(n--){
scanf("%d %d %d",&address, &data, &next);
a[address] = next;
b[address] = data;
} address = head;
while(a[address]!= -){
address = a[address];
num++;
}
if( num >= k){
p = head;
q = a[head];
while( number != k){
a[p] = a[a[p]];
a[q] = head;
head = q;
q = a[p];
number++;
}
}
address = head;
while(a[address]!= -){
printf("%05d %d %05d\n",address, b[address], a[address]);
address = a[address];
}
printf("%05d %d %d",address, b[address], a[address]);
return ;
}
 

PAT Basic 1025的更多相关文章

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

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

  2. PAT Basic 1057

    1057 数零壹 给定一串长度不超过 10​5​​ 的字符串,本题要求你将其中所有英文字母的序号(字母 a-z 对应序号 1-26,不分大小写)相加,得到整数 N,然后再分析一下 N 的二进制表示中有 ...

  3. PAT (Basic Level) Practise (中文)-1039. 到底买不买(20)

    PAT (Basic Level) Practise (中文)-1039. 到底买不买(20) http://www.patest.cn/contests/pat-b-practise/1039 小红 ...

  4. PAT (Basic Level) Practise (中文)- 1022. D进制的A+B (20)

    PAT (Basic Level) Practise (中文)-  1022. D进制的A+B (20)  http://www.patest.cn/contests/pat-b-practise/1 ...

  5. PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20)

    PAT (Basic Level) Practise (中文)- 1024. 科学计数法 (20) http://www.patest.cn/contests/pat-b-practise/1024 ...

  6. PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)

    PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)    http://www.patest.cn/contests/pat-b-practise/10 ...

  7. PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)

    PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)  http://www.patest.cn/contests/pat-b-practise/1027 本题 ...

  8. PAT (Basic Level) Practise (中文)-1028. 人口普查(20)

    PAT (Basic Level) Practise (中文)-1028. 人口普查(20)   http://www.patest.cn/contests/pat-b-practise/1028 某 ...

  9. PAT (Basic Level) Practise (中文)-1029. 旧键盘(20)

    PAT (Basic Level) Practise (中文)-1029. 旧键盘(20) http://www.patest.cn/contests/pat-b-practise/1029 旧键盘上 ...

随机推荐

  1. Codeforces Round #497 (Div. 2) A. Romaji

    Bryce1010模板 http://codeforces.com/contest/1008/problems #include <bits/stdc++.h> using namespa ...

  2. 2017"百度之星"程序设计大赛 - 初赛(A)今夕何夕

    Problem Description 今天是2017年8月6日,农历闰六月十五. 小度独自凭栏,望着一轮圆月,发出了“今夕何夕,见此良人”的寂寞感慨. 为了排遣郁结,它决定思考一个数学问题:接下来最 ...

  3. 洛谷P1896||bzoj1087 [SCOI2005]互不侵犯

    bzoj1087 洛谷P1896 想了很久,太久没做状压都已经不会了... 状压每一行就好了 #include<cstdio> #include<algorithm> #inc ...

  4. StretchDIBits速度测试(HALFTONE)

    StretchDIBits速度测试(HALFTONE) 下面实验中显示窗口大小为1024*768,拉伸模式设为HALFTONE. 一.单通道图像 (1) 保持图像高度为1024,宽度从24到2024递 ...

  5. c 语言写的高级Oracle®数据库调优及监控工具

    http://www.lab128.com.cn/lab128_why.html ###另外一款ORALCE Monitor tool freee https://www.myorasql.com/ ...

  6. VS2015 C#利用QrCodeNet生成QR Code

    Step by step Create QR Code with QrCodeNet Step.1 新建項目 Step.2 在窗口中拖入一個Button Step.3 下載QrCodeNet代碼,解壓 ...

  7. AJPFX分享JAVA修饰符详解

    1.类的修饰符分为:可访问控制符和非访问控制符两种. 可访问控制符是:公共类修饰符 public 非访问控制符有:抽象类修饰符 abstract :最终类修饰符 final 1 )公共类修饰符 pub ...

  8. 7、斐波那契数列、跳台阶、变态跳台阶、矩形覆盖------------>剑指offer系列

    题目:斐波那契数列 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0). f(n) = f(n-1) + f(n-2) 基本思路 这道题在剑指offe ...

  9. Json字符串转excel表格文件

    假如我们有一段json串,该json串是由一系列结构相同的数据集合组成,如下: { "data": [ { "groupId": "com.test. ...

  10. iOS Runloop 消息循环

    介绍 Runloop是一种事件监听循环,可以理解成一个while死循环,监听到事件就起来,没有就休息. Runloop可以在不同模式下进行切换,iOS有五种模式,其中UIInitializationR ...