想法:
这题必须写两句。首先我感受到了大佬来自智商的碾压,大佬的代码贴在最后。另外就是我做题 太烂了,写的我自己都看不下去,反观大佬的代码,逻辑清晰,思维跳跃,这才是人才。我差的不是一星半点。
这题用了两个多小时,真是太菜了。
坚持下来对自己来说也是有进步吧。
题目
给定一个常数 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 (≤105)、以及正整数 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
结尾无空行
我的代码:
#include<bits/stdc++.h>
using namespace std;
struct Node
{
string s1;
int n;
string s2;
};
typedef struct Node List;
int main()
{
string s;
int n,k,i,j,pt,flag = 1;
List a[100000],temp;
cin>>s>>n>>k;
for(i = 0;i < n;i++)
{
cin>>a[i].s1>>a[i].n>>a[i].s2;
}
i = 0;
j = 0;
pt = 0;
//按地址排序
while(flag)
{
for(i = pt;i < n;i++)
{
if(a[i].s1 == s)
{
s = a[i].s2;
temp = a[pt];
a[pt] = a[i];
a[i] = temp;
pt++;
if(s == "-1")
{
flag = 0;
n = pt;
}
break;
}
}
}
//反转
/*
00100 1 12309
12309 2 33218
33218 3 00000
00000 4 99999
99999 5 68237
68237 6 -1
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
*/
int num1 = n / k;//逆序输出num1轮
int num2 = n - n % k;//顺序输出的开始下标
int now = 0;
int m;
string tempS;
for(i = 0;i <num1;i++)
{
for(j = i * k,m = i * k + k -1;j - i * k < k / 2;j++,m--)
{
temp = a[j];
a[j] = a[m];
a[m] = temp;
}
}
a[n - 1].s2 = "-1";
for(i = n - 1;i > 0;i--)
{
a[i - 1].s2 = a[i].s1;
}
//输出全部
for(i = 0;i < n;i++)
{
cout<<a[i].s1<<' '<<a[i].n<<' '<<a[i].s2<<endl;
}
}
大佬的代码:(膜拜)
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int address;
int num;
int next;
}Node;
int main()
{
int i, j, n, m, k, roll, next;
Node *node, tmp;
scanf("%d%d%d", &next, &n, &k);
node = (Node*)malloc(sizeof(Node) * n);
for (i = 0; i < n; i++)
{
scanf("%d%d%d", &node[i].address, &node[i].num, &node[i].next);
}
for (i = 0; i < n; i++)
{
for (j = i; j < n; j++)
{
if (node[j].address == next)
{
tmp = node[i];
node[i] = node[j];
node[j] = tmp;
next = node[i].next;
if (node[i].next == -1)
{
n = i + 1;
}
break;
}
}
}
roll = n / k;
for (j = 0; j < roll; j++)
{
for (m = k - 1, i = j * k; i - j * k < k / 2; i++, m--)
{
tmp = node[i];
node[i] = node[m + j * k];
node[m + j * k] = tmp;
}
}
node[n - 1].next = -1;
for (i = n - 1; i > 0; i--)
{
node[i - 1].next = node[i].address;
}
for (i = 0; i < n; i++)
{
if (i == n - 1)
{
printf("%05d %d %d\n", node[i].address, node[i].num, node[i].next);
break;
}
printf("%05d %d %05d\n", node[i].address, node[i].num, node[i].next);
}
system("pause");
return 0;
}