zoukankan      html  css  js  c++  java
  • PAT-2019年冬季考试-甲级 7-2 Block Reversing (25分) (链表转置)

    7-2 Block Reversing (25分)
     

    Given a singly linked list L. Let us consider every K nodes as a block (if there are less than K nodes at the end of the list, the rest of the nodes are still considered as a block). Your job is to reverse all the blocks in L. For example, given L as 1→2→3→4→5→6→7→8 and K as 3, your output must be 7→8→4→5→6→1→2→3.

    Input Specification:

    Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤) which is the total number of nodes, and a positive K (≤) which is the size of a block. The address of a node is a 5-digit nonnegative integer, and NULL is represented by −.

    Then N lines follow, each describes a node in the format:

    Address Data Next
    

    where Address is the position of the node, Data is an integer, and Next is the position of the next node.

    Output Specification:

    For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

    Sample Input:

    00100 8 3
    71120 7 88666
    00000 4 99999
    00100 1 12309
    68237 6 71120
    33218 3 00000
    99999 5 68237
    88666 8 -1
    12309 2 33218
    

    Sample Output:

    71120 7 88666
    88666 8 00000
    00000 4 99999
    99999 5 68237
    68237 6 00100
    00100 1 12309
    12309 2 33218
    33218 3 -1

    题意:

    链表的转置。给定N和K,每K个转一转,最后还要整个再转一转。

    题解:

    这道题挺熟悉的,和1074 Reversing Linked List (25分)差不多嘛。

    当时依稀记得,用vector超方便,但是忘了怎么用

    reverse(valid.begin()+i*k,valid.begin()+i*k+k);

    然后就十分痛苦地用不了现成的reverse,只好把开两个vector当成数组用,然后非常艰难地写完了。。。。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
        int d;
        int id;
        int nx;
    }a[100005],b[100005];
    vector<node>v;
    int main(){
        int n,k;
        int root;
        cin>>root>>n>>k;
        for(int i=1;i<=n;i++){
            int x,y,z;
            cin>>x>>z>>y;
            a[x].d=z;
            a[x].nx=y;
            a[x].id=x;
        }
        node nroot=a[root];
        v.push_back(nroot);
        int num=1;
        while(nroot.nx!=-1){//先按照链表的顺序存好放到vector中 
            nroot=a[nroot.nx];
            v.push_back(nroot);
            num++;
        }
        int cs=num/k;//cs表示要转几次 
        for(int i=0;i<cs;i++){
            for(int j=0;j<k;j++){
                a[i*k+j]=v.at(i*k+k-j-1);//每k个转一转,本来可以 reverse(v.begin()+i*k,v()+i*k+k);唉。。。 
            }
        }
        int pp=cs*k-1;
        if(cs*k<num){//剩下的不到K个也要转 
            for(int i=v.size()-1;i>=cs*k;i--) a[++pp]=v.at(i);
        }
        for(int i=0;i<num;i++){//再整个链表转一下,本来可以reverse(v.begin(),v.end())的,唉。。。 
            b[i]=a[num-i-1];
        }
        for(int i=0;i<num;i++){//修改b数组里每个结构体的nx值 
            if(i!=num-1) b[i].nx=b[i+1].id;
            else b[i].nx=-1;
        }
        for(int i=0;i<num-1;i++){//输出 
            printf("%05d %d %05d
    ",b[i].id,b[i].d,b[i].nx);
        }
        printf("%05d %d -1",b[num-1].id,b[num-1].d);
        return 0;
    }
  • 相关阅读:
    关于Android的nodpi,xhdpi,hdpi,mdpi,ldpi
    在android上监听网络状态的变更
    mysql:insert on duplicate key 版本导致问题
    android中TextView中文字体粗体的方法
    10.2香港一人一日购物游流水账
    结婚的意义
    关于摄影的若干个命题
    人生若彷如倒序。。。本杰明·巴顿奇事 The Curious Case of Benjamin Button
    阳光十六法则
    花街人真多,多我一个就溢出了
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13270574.html
Copyright © 2011-2022 走看看