给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转。例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4;如果 K 为 4,则输出应该为 4→3→2→1→5→6,即最后不到 K 个元素不反转。
每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 N (≤10?5??)、以及正整数 K (≤N),即要求反转的子链结点的个数。结点的地址是 5 位非负整数,NULL 地址用 −1 表示。
接下来有 N 行,每行格式为:
Address Data Next
其中 Address
是结点地址,Data
是该结点保存的整数数据,Next
是下一结点的地址。
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
1 #include<iostream>
2 #include<vector>
3 #include<algorithm>
4 #include<iterator>
5 #include<utility>
6 using namespace std;
7 typedef pair<int, int> P;
8 vector<P> coll(100000);
9 struct node
10 {
11 int adress;
12 int data;
13 int next;
14 node(int a, int b, int c) :adress(a), data(b), next(c){};
15 };
16 vector<node> vec;
17 int main()
18 {
19 int adress, data, next;
20 int n, k, first;
21 while (scanf("%d%d%d", &first, &n, &k) != EOF)
22 {
23 int num = n;
24 while (n--)
25 {
26 scanf("%d%d%d", &adress, &data, &next);
27 P p;
28 p.first = data;
29 p.second = next;
30 coll[adress] = p;
31 }
32 int index = first;
33 int cnt(0);//在链表上的结点个数
34 while (index != -1)
35 {
36 cnt++;
37 vec.push_back(node(index, coll[index].first, coll[index].second));
38 index = coll[index].second;
39 }
40 int t = cnt / k;
41 for (int i = 0; i < t; i++)
42 std::reverse(vec.begin() + i*k, vec.begin() + (i + 1)*k);
43 for (int i = 0; i < vec.size()-1;i++)
44 {
45 printf("%05d %d %05d\n", vec[i].adress, vec[i].data, vec[i + 1].adress);
46 }
47 printf("%05d %d %d\n", vec[vec.size() - 1].adress, vec[vec.size() - 1].data, -1);
48
49 }
50 return 0;
51 }
原文:https://www.cnblogs.com/xwl3109377858/p/10472969.html