1025 反转链表 (25 分)
原题
https://pintia.cn/problem-sets/994805260223102976/problems/994805296180871168
代码
代码是看的别人的。
思路:用一个结构体数组来存原始数据,并数组的序号就是其首个元素的地址,方便之后取出。
一个数组来存储正确连接顺序,对这个数组进行反转操作。
测试点
输入K=0
输出 -1
输入K=1
输出
#include
#include
using namespace std;
struct Node
{
int address;
int data;
int next;
} list[100000];
int main()
{
int start, N, K;
vector vec;
cin >> start >> N >> K;
for (int i = 0; i < N; i++)
{
int temp;
cin >> temp;
cin >> list[temp].data >> list[temp].next;
list[temp].address = temp;//数组的序号就是其首个元素的地址,方便之后取出
}
//根据next值,把正确连接顺序放入另一个数组
while (start != -1)
{
vec.push_back(start);
start = list[start].next;
}
//对vec数组进行,每K个数据的反转操作
int cnt = 0;
if (K)//K不等于0
{
while (cnt < N / K)
{
int end=cnt*K + K-1;
for (int i = cnt*K; i < cnt*K + K/ 2; i++)//交换K个元素内的顺序
{
int t = vec[i];
vec[i]=vec[end-(i-cnt*K)];
vec[end-(i-cnt*K)]=t;
}
cnt++;
}
}
//按首尾格式输出
for (int j = 0; j < vec.size(); j++)
{
if(j!=vec.size()-1)
printf("%05d %d %05d\n", vec[j], list[vec[j]].data, vec[j + 1]);
else printf("%05d %d ", vec[j], list[vec[j]].data);
}
cout<<-1;
return 0;
}
有一个测试点,没找到。呜呜
把代码替换成那个大佬的可以通过,谁可以告诉我一下是哪里不一样
//对vec数组进行,每K个数据的反转操作
if (K)
{
for (int i = 0; i < vec.size(); i+=K)
{
int end = i + K;
if (end>vec.size())
break;
for (int j = i; j
其它大佬的
#include
#include
using namespace std;
int main() {
int first, k, n, temp;
cin >> first >> n >> k;
int data[100005], next[100005], list[100005];
for (int i = 0; i < n; i++) {
cin >> temp;
cin >> data[temp] >> next[temp];
}
int sum = 0;//不一定所有的输入的结点都是有用的,加个计数器
while (first != -1) {
list[sum++] = first;
first = next[first];
}
for (int i = 0; i < (sum - sum % k); i += k)
reverse(begin(list) + i, begin(list) + i + k);
for (int i = 0; i < sum - 1; i++)
printf("%05d %d %05d\n", list[i], data[list[i]], list[i + 1]);
printf("%05d %d -1", list[sum - 1], data[list[sum - 1]]);
return 0;
}
扩展:C++中的swap(交换函数)
https://blog.csdn.net/qq_40794973/article/details/88406536
C++提供了一个swap函数用于交换,用法如下。
swap 包含在命名空间std 里面