PAT A1074 Reversing Linked List

思路:由于PAT输入数据的特殊性,本题考虑用静态链表来实现。

注意输入数据中可能有无效的结点,因此需要县遍历一次并且确定有效结点数order,并且为每个有效结点附上顺序标记。

根据顺序标记进行排序后直接对静态链表数组中前order个结点进行输出,每k个结点倒序输出,最后一组若不满足k个结点则按正常顺序输出。

相似题目:LeetCode 25.K个一组反转链表

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 100005;
typedef struct {
    int addr, data, next;
    int order;
} Node;
Node node[maxn];
bool cmp(Node a, Node b) {
    return a.order < b.order;
}
int main() {
    int s1, n, k;
    scanf("%d %d %d", &s1, &n, &k);
    int addr, data, next;
    for(int i = 0; i < maxn; i++) 
        node[i].order = maxn;
    for(int i = 0; i < n; i++) {
        scanf("%d %d %d", &addr, &data, &next);
        node[addr].addr = addr;
        node[addr].data = data;
        node[addr].next = next;
    }
    int p = s1, order = 0;
    while(p != -1) {
        node[p].order = order++;
        p = node[p].next;
    }
    sort(node, node + maxn, cmp);
    for(int i = 0; i < order / k; i++) {
        for(int j = (i + 1) * k - 1; j > i * k; j--) 
            printf("%05d %d %05d\n", node[j].addr, node[j].data, node[j-1].addr);
        printf("%05d %d ", node[i * k].addr, node[i * k].data);
        if(i < order / k - 1)
            printf("%05d\n", node[(i + 2) * k - 1].addr);
        else {
            if(order % k == 0) 
                printf("-1\n");
            else {
                printf("%05d\n", node[(i + 1) * k].addr);
                for(int m = order / k * k; m < order; m++) {
                    printf("%05d %d ", node[m].addr, node[m].data);
                    if(m < order - 1)
                        printf("%05d\n", node[m+1].addr);
                    else printf("-1\n");
                }
            }
        }
    }
    return 0;
}