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 里面