02-线性结构3 Reversing Linked List (25 分)

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、使用C++的时候,对于所给的地址值,不能简单设置为int类型的变量!!!如0开头的五位数就没办法按照五位的格式正确输出;

2、测试点数据中存在冗余元素,所以需要在程序中统计真实有效的数据个数;

3、对于多段实现反转的情况要好好分析“指针”的赋值变化

#include<iostream>
#include<unordered_map>
#include<string>
using namespace std;
class Node {
public:
	string add;
	int num;
	string next;
	Node(string a=" ", int n=-1, string ne=" ") {
		add = a; num = n; next = ne;
	}
};
int main() {
	string fir;int N, K; cin >> fir >> N >> K;
	unordered_map<string, Node>rec;
	int n = N;
	while (n--) {
		string h, t; int  v; cin >> h >> v >> t;
		rec[h] = Node(h, v, t);
	}
	int sum = 0; string p = fir;

	while (p != "-1") {
		sum++;
		p = rec[p].next;
	}
	int times = int(sum / K); int time = times;
	string f = fir;string r = f;
	string pre = "-1";
	while (time--) {
		int flag = K - 1;while (flag--) r = rec[r].next;
		string next = rec[r].next;
		string nextpre = f;
		while (f != r) {
			string tem = f;
			f = rec[f].next;
			rec[tem].next = rec[r].next;
			rec[r].next = tem;
		}
		if (time == times - 1)fir = f;
		else rec[pre].next =r;
		pre = nextpre; f = r = next;
	}

	while (fir != "-1") {
		cout << rec[fir].add << " " << rec[fir].num << " " << rec[fir].next;
		fir = rec[fir].next;
		if (fir != "-1")cout << endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值