给定一个常数 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
", vec[i].adress, vec[i].data, vec[i + 1].adress);
46 }
47 printf("%05d %d %d
", vec[vec.size() - 1].adress, vec[vec.size() - 1].data, -1);
48
49 }
50 return 0;
51 }
补充我自己写的代码,感觉写的比较清晰易懂,可以看看注释......
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 using namespace std;
10 #define ll long long
11 #define dd cout<<endl
12 const int inf=99999999;
13 const int mod=1e9+7;
14 const int maxn=1e5+10;
15 typedef struct
16 {
17 int address;
18 int data;
19 int next;
20 } St;
21
22 St sum[maxn];
23
24 vector<St>list;//遍历一遍结构体,储存链表,去除没用的节点
25
26 int main()
27 {
28 int startt,n,k;
29 scanf("%d%d%d",&startt,&n,&k);
30
31 int index,value,Next;
32
33 for(int i=0;i<n;i++)//读入链表
34 {
35 scanf("%d%d%d",&index,&value,&Next);
36 sum[index].address=index;
37 sum[index].data=value;
38 sum[index].next=Next;
39 }
40
41 int p=startt;//头指针
42
43 while(p!=-1)//读入vector数组
44 {
45 list.push_back(sum[p]);
46 p=sum[p].next;
47 }
48
49 int flag=0;
50 int temp=k-1;
51
52 while(temp<list.size())//每反转k个,再输出
53 {
54 for(int i=temp;i>temp-k;i--)
55 {
56 if(flag==0)
57 {
58 flag=1;
59 printf("%05d %d ",list[i].address,list[i].data);
60 }
61 else
62 {
63 printf("%05d
%05d %d ",list[i].address,list[i].address,list[i].data);
64 }
65 }
66 temp+=k;
67 }
68
69 for(int i=temp-k+1;i<list.size();i++)//输出最后一部分
70 {
71 if(flag==0)
72 {
73 flag=1;
74 printf("%05d %d ",list[i].address,list[i].data);
75 }
76 else
77 {
78 printf("%05d
%05d %d ",list[i].address,list[i].address,list[i].data);
79 }
80 }
81 printf("-1
");
82
83 return 0;
84 }
PS:最后一道乙级题终于补完了,感觉链表题刚开始写确实很难,不过多看看别人写的代码,自己多写几遍就会了,WA几次问题不大,也就是容易自闭而已,在此感谢另一位大佬给我的帮助,自己刷题总是会遇到瓶颈的,很正常,最好是多跟别人交流沟通,想想别人是怎么想的,乙级题也算是告一段落了......