• PAT 1074. Reversing Linked List


    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<iostream>
    #include<vector>
    #define max 100000
    using namespace std;
    struct ele{
        int data=0;
        int next=0;
    };
    int start=0,N=0,interval=0,first=0,tag=0;
    void reverse(vector<ele>& vi,int& s){
        int inter=interval; int fir,sec,thi,temp,last=s;
        if(tag!=0) s=vi[s].next;
        temp=s; fir=s; sec=vi[fir].next; thi=vi[sec].next; 
        for(int i=1;i<=inter-1;i++){
            vi[sec].next=fir;
            fir=sec;
            sec=thi;
            thi=vi[thi].next;
        }
        vi[temp].next=sec;
        if(tag!=0) vi[last].next=fir;
        if(tag++==0)
        first=fir;
    }
    int main(){
        int cnt,address;
        cin>>start>>N>>interval;
        vector<ele> vi(max);
        for(int i=0;i<N;i++){
            scanf("%d",&address);
            scanf("%d%d",&vi[address].data,&vi[address].next);
        }
        int begin=start;
        while(begin!=-1){cnt++; begin=vi[begin].next;}
        if(interval==1||cnt<interval) first=start;
        else{
            int s=start,times;
            times=cnt/interval;
            while(times--){
                reverse(vi,s);
            }
        }
        begin=first;
        while(vi[begin].next!=-1){
            printf("%05d %d %05d
    ",begin,vi[begin].data,vi[begin].next);
            begin=vi[begin].next;
        }
            printf("%05d %d %d
    ",begin,vi[begin].data,vi[begin].next);
        return 0; 
    }
    
    
  • 相关阅读:
    Extjs combobox设置默认值
    sql 游标循环遍历
    .NET中的DES对称加密
    Asp.Net生命周期
    浅谈C#随机数发生器
    面向对象-多态 附抽象
    c#常用的一些命名空间
    c#面向对象编程基础
    string应用
    [自习任我行]第二阶段任务跟踪10
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/8399463.html
Copyright © 2020-2023  润新知