• 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 (≤) which is the total number of nodes, and a positive K (≤) 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
     
     题解:(关键点)为节点设立order计数,方便排序,(复杂点)每一块的处理
    最后一个测试点过不去,难道是算法笔记上代码有问题?柳神代码正确
    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1000010;
    #define inf 0x3fffffff
    struct Node{
        int address,data,next;
        int order;
    }node[maxn];
    bool cmp(Node a,Node b){
        return a.order<b.order;
    }
    int main(){
        for(int i=0;i<maxn;i++){
            node[i].order=maxn;
        }
        int begin,n,k;
        scanf("%d %d %d",&begin,&n,&k);
        int count=0;
        int address,data,next;
        for(int i=0;i<n;i++){
            scanf("%d %d %d",&address,&data,&next);
            node[address].address=address;
            node[address].data=data;
            node[address].next=next;
        }
        int p=begin;
        while(p!=-1){
            node[p].order=count++;
            p=node[p].next;
        }
        sort(node,node+maxn,cmp);
        int i,j;
        for(i=0;i<count/k;i++){
            for(j=(i+1)*k-1;j>i*k;j--){
                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("%d
    ",-1);
                }
                else
                {
                    printf("%05d
    ",node[(i+1)*k].address);
                    for(j=n/k*k;j<n;j++){
                        if(j!=n-1){
                            printf("%05d %d %05d
    ",node[j].address,node[j].data,node[j+1].address);
                        }
                        else{
                            printf("%05d %d %d
    ",node[j].address,node[j].data,-1);
                        }
                        
                    }
                        
                }
    
        }
        }
        return 0;
    }
  • 相关阅读:
    LINUX服务器上新增用户名
    Mac OS X 常用快捷键
    leetcode 学习心得 (2) (301~516)
    leetcode 学习心得 (1) (24~300)
    C 实现简单的栈
    Hbase压力测试
    hadoop,yarn和vcpu资源配置
    ubuntu14通过trove/redstack安装openstack环境
    fedora 使用trove的redstack 安装openstack环境
    fedora22 mysql安装
  • 原文地址:https://www.cnblogs.com/dreamzj/p/15018151.html
Copyright © 2020-2023  润新知