PAT - 甲级 - 1074. Reversing Linked List (25)(链表)

本文介绍了一种算法,该算法接收一个单向链表和一个整数K作为输入,然后将链表中的每K个节点进行反转。通过遍历链表并将节点压入栈中来实现这一操作,当栈的大小达到K时,再依次弹出栈中的元素以实现节点的反转。

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

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

给定条件:
1.n个节点的地址,值,下一个地址
2.链表的第一个节点的地址
3.每k个元素进行一次反转,如果剩下的不够k个则不进行反转

求解:
1.遍历链表,直接把元素往栈中放,满k个就全部弹出来放到另一个容器,(后进先出实现“反转”)
2.最后把不满k个的元素顺序拿出即可


#include <cstdio>
#include <vector>
using namespace std;

struct Node {
	int ad, val, nextAd;
} node[100010];

int start, n, k;
int ad, val, nextAd;

vector<Node> v, ans;

int main() {
	scanf("%d%d%d", &start, &n, &k);

	for(int i = 0; i < n; i++) {
		scanf("%d%d%d", &ad, &val, &nextAd);
		node[ad].ad = ad;
		node[ad].val = val;
		node[ad].nextAd = nextAd;
	}

	for(int i = start; i != -1; i = node[i].nextAd) {
		v.push_back(node[i]);

		if(v.size() % k == 0) {
			while(!v.empty()) {
				ans.push_back(v.back());
				v.pop_back();	
			}
		}
	}
	for(int i = 0; i < v.size(); i++) {
		ans.push_back(v[i]);
	}

	for(int i = 0; i < ans.size()-1; i++) {
		printf("%05d %d %05d\n", ans[i].ad, ans[i].val, ans[i+1].ad);
	}
	printf("%05d %d -1\n", ans.rbegin()->ad, ans.rbegin()->val);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值