1025 反转链表
Statement
Metadata
- 作者: CHEN, Yue
 - 单位: 浙江大学
 - 代码长度限制: 16 KB
 - 时间限制: 400 ms
 - 内存限制: 64 MB
 
给定一个常数 
输入格式
每个输入包含 1 个测试用例。每个测试用例第 1 行给出第 1 个结点的地址、结点总个数正整数 
接下来有 
其中 Address 是结点地址,Data 是该结点保存的整数数据,Next 是下一结点的地址。
输出格式
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
输入样例
输出样例
Solution
#include <bits/stdc++.h>
using namespace std;
#define maxn 100000
struct node {
    int add, data, next;
} vsort[maxn], vout[maxn], temp;
int main() {
    map<int, node> p;
    int first, N, K;
    cin >> first >> N >> K;
    int i, j, k;
    for (i = 0; i < N; i++) {
        scanf("%d%d%d", &temp.add, &temp.data, &temp.next);
        p[temp.add] = temp;
    }
    map<int, node>::iterator it;
    if (first == -1)
        cout << "-1\n";
    else {
        int nextAdd = first;
        for (i = 0; nextAdd != -1; i++, nextAdd = p[nextAdd].next) vsort[i] = p[nextAdd];
        int length = i;
        int right = K - 1;
        for (right = K - 1, j = 0; right < length; right += K) {
            for (i = right; i > right - K; i--) vout[j++] = vsort[i];
        }
        for (i = right - K + 1; i < length; i++) vout[j++] = vsort[i];
        for (i = 0; i < length - 1; i++) {
            vout[i].next = vout[i + 1].add;
            printf("%05d %d %05d\n", vout[i].add, vout[i].data, vout[i].next);
        }
        printf("%05d %d -1\n", vout[i].add, vout[i].data);
    }
}
  Last update: May 4, 2022