PAT1074——Reversing Linked List

来源:互联网 发布:浙江贰贰网络稳定吗 编辑:程序博客网 时间:2024/06/08 00:39

答案上面是整体排序,然后分段显示,需要考虑的情况太多,还不如在写order的时候就将排序考虑进去,这样就没有其他需要考虑的情况了,这样不容易犯错。

唯一的问题就是需要遍历两遍链表,第一遍获得最大有效数目,然后按照顺序写order,第二遍将需要反序的order写入即可。


#define maxn 100010struct Node{    int address;    int next;    int num;    int order;    Node(){        order = 100000;    }}node[maxn];int start, n, k;bool cmp(Node a, Node b){    return a.order < b.order;}int main(){    cin>>start>>n>>k;        int addr, num, ne, num_max = 0;        for(int i = 0; i<n; i++){        scanf("%d %d %d", &addr, &num, &ne);        node[addr].num = num;        node[addr].next = ne;        node[addr].address = addr;    }        int next_temp = start;    while(next_temp != -1){        node[next_temp].order = num_max++;        next_temp = node[next_temp].next;    }        int group = floor((double)num_max/k);    next_temp = start;    for(int i = 0; i<group; i++){        int order_temp = (i+1)*k-1;        while(order_temp >= i*k){            node[next_temp].order = order_temp--;            next_temp = node[next_temp].next;        }    }    sort(node, node+maxn, cmp);    for(int i = 0; i<num_max-1; i++){        printf("%05d %d %05d\n", node[i].address, node[i].num, node[i+1].address);    }    printf("%05d %d %d\n", node[num_max-1].address, node[num_max-1].num, -1);        return 0;}