最后一个测试用例很坑,注意给出的n个节点不一定都在以h为头的链表上,这种测试用例在PAT链表相关的问题中多次出现,要予以注意。

AC代码

#include <vector>
#include <map>
#include <algorithm>
#include <cstdio>
using namespace std;
class node{
public:
    int addr;
    int v;
    int next;
};
int main(){
    int h,n,k;
    scanf("%d %d %d",&h,&n,&k);
    vector<node> list;
    map<int,node> rec;
    for(int i = 0;i < n;i++){
        node tmp;
        scanf("%d %d %d",&tmp.addr,&tmp.v,&tmp.next);
        rec[tmp.addr] = tmp;
    }
    int addr(h);
    int count(0);
    while(addr != -1){
        list.push_back(rec[addr]);
        addr = rec[addr].next;
    }
    n = list.size();
    if(n < k){
        for(int i = 0;i < list.size();i++){
            if(list[i].next != -1)
                printf("%05d %d %05d\n",list[i].addr,list[i].v,list[i].next);
            else
                printf("%05d %d -1\n",list[i].addr,list[i].v);
        }
        return 0;
    }
    for(int i = 0;i < n / k;i++){
        reverse(list.begin() + i * k,list.begin() + (i+1) * k);
        for(int j = i * k;j < (i+1) * k;j++){
            if(j != (i+1) * k - 1)
                list[j].next = list[j+1].addr; 
        }
    }
    for(int i = 0;i < n / k;i++){
        if((i+1) * k < n)
            list[i * k + k - 1].next = list[(i+1) * k].addr;
        else
            list[i * k + k - 1].next = -1;
    }
    list.back().next = -1;
    for(int i = 0;i < list.size();i++){
        if(list[i].next != -1)
            printf("%05d %d %05d\n",list[i].addr,list[i].v,list[i].next);
        else
            printf("%05d %d -1\n",list[i].addr,list[i].v);
    }
    return 0;
}

 

posted on 2016-03-09 00:04  aldorado  阅读(132)  评论(0编辑  收藏  举报