zoukankan      html  css  js  c++  java
  • 1074. Reversing Linked List (25)

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.

    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 (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

    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 6 4
    00000 4 99999
    00100 1 12309
    68237 6 -1
    33218 3 00000
    99999 5 68237
    12309 2 33218
    

    Sample Output:

    00000 4 33218
    33218 3 12309
    12309 2 00100
    00100 1 99999
    99999 5 68237
    68237 6 -1
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn = 100100;
    struct Node{
        int address,data,next;
        int order;
    }node[maxn];
    
    bool cmp(Node a,Node b){
        return a.order < b.order;
    }
    int main(){
        int i,address;
        for(i = 0; i < maxn; i++){
            node[i].order = maxn;
        }
        int begin,n,k;  //起始节点地址,节点数目,分组数 
        scanf("%d%d%d",&begin,&n,&k);
        
        for(i = 0; i < n; i++){
            scanf("%d",&address);
            scanf("%d%d",&node[address].data,&node[address].next);
            node[address].address = address;
        }
        int p = begin,count = 0;
        while(p != -1){
            node[p].order = count++;
            p = node[p].next;
        }
        sort(node,node+maxn,cmp);
        n = count; //因为count=0占一个有效节点,退出循环时,count值就是有效节点 
        for(i = 0; i < n/k; i++){ //枚举完整的n/k块 
           for(int j = (i+1)*k - 1; j > i*k; j-- ){ //每块的第i个倒着输出,剩余最后一个节点 
               printf("%05d %d %05d
    ",node[j].address,node[j].data,node[j-1].address);
           }
           printf("%05d %d ",node[i*k].address,node[i*k].data); //每块的最后一个节点的前两项数据 
            if(i < n/k -1)  { //如果是非最后一块节点 
                printf("%05d
    ",node[(i+2)*k-1].address);
            }else{   //如果是最后一块节点 
                if(n % k == 0) printf("-1
    ");  //刚好除整 
                else{   //如果最后一个节点不规则 
                printf("%05d
    ",node[(i+1)*k].address);
                for(i = n/k*k; i < n; i++){
                    printf("%05d %d ",node[i].address,node[i].data);
                    if(i < n - 1){
                        printf("%05d
    ",node[i+1].address);
                    }else{
                        printf("-1
    ");
                     }// else
                } // for(i)
               }//else
            }//else
        } //for(i)
       
        return 0;
    }
  • 相关阅读:
    linux解压缩各种命令
    memset
    STRUCT_OFFSET( s, m )宏
    请问这个宏是什么意思 #define NOTUSED(v) ((void) v)?
    typedef特殊用法:typedef void* (*fun)(void*)
    localtime、localtime_s、localtime_r的使用
    Git使用(一)
    【转】linux gcc _attribute__((weak)) 简介及作用
    我的技术博客
    .net 4.0(2.0)“检测到有潜在危险的 Request.Form 值”的解决方法
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/8550233.html
Copyright © 2011-2022 走看看