1074 Reversing Linked List (25 分)
测试点1,5错误已解决。
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 (≤10 ^5 ) 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
题意
给出一个链表,要求反转前k个数,输出新链表。
PS:
第一次交测试点1,5错误,不明白为什么。后来百度查明原因:(来自博主:给个选择:7-32 Reversing Linked List (25分)(思路+最后一个测试点+极简代码))
可能给的节点有的不在链表上,这时不用翻转也不用输出。
还有注意翻转的是[i,i+k) 左闭右开区间,而reverse函数是左开右闭区间。
代码
#include <iostream>
#include <vector>
#include <algorithm> //reverse函数
using namespace std;
struct node {
int add,data,next;
} Node[100010];
int main() {
int t,n,k,a;
scanf("%d%d%d",&t,&n,&k);
vector<node> v;
for(int i=0; i<n; i++) {
scanf("%d",&a);
Node[a].add=a;
scanf("%d%d",&Node[a].data,&Node[a].next);
}
int p=t;
while(p!=-1) {
v.push_back(Node[p]);
p=Node[p].next;
}
//reverse(v.begin,v.begin+k); //这样写会导致测设点1,5错误
for(int i=0;i+k<=v.size();i+=k) reverse(v.begin()+i,v.begin()+i+k);
for(int i=0; i<v.size(); i++) {
if(i==0) printf("%05d %d ",v[i].add,v[i].data);
else
printf("%05d\n%05d %d ",v[i].add,v[i].add,v[i].data);
}
printf("-1");
return 0;
}