【PAT刷题甲级】1074.Reversing Linked List

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值