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

该博客讨论了一道编程题目,要求对给定的链表进行操作,将每K个节点进行反转。博客中提到了初次提交时遇到的测试点1和5的错误,并解释了错误原因,即需要考虑链表中某些节点可能不存在,以及反转区间为左闭右开。博主提供了代码实现,使用了C++标准库中的`reverse`函数来完成反转操作,并给出了测试用例及其结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值