pat甲级1165 Block Reversing


这题的最后一个测试点会给脏数据,就是数据中不是所有的点都出现在链表中。在计数时不能直接用n。
这题的关键思路是先分块反转再整体反转得到目标链表不清楚这点的话写模拟会写的非常冗余且容易出错(数据结构一定要学好哇

下附25分代码:

#include
using namespace std;

int l[100005];  //按地址存值
int nx[100005]; //存这个节点的下一个节点地址
int main(){
    memset(l,-1,sizeof (l));
    memset(nx,-1,sizeof (nx));
    int head,n,k;
    cin >> head >> n >> k;

    for(int i=1;i<=n;i++){
        int adr,key,next;
        cin >> adr >> key >> next;
        l[adr] = key;
        nx[adr] = next;
    }

    vector v;  //得到最初的链表
    for(int i=head;i!=-1;i = nx[i]){
        v.push_back(i);
    }

    //分块反转
    int todo = v.size()/k;
    for(int i=0;i