02-(セグメント反転リストあたり)リンクリスト(25分)反転線形構造3を

一定の与えられた  Kと単独でリンクされたリスト  Lを、あなたは、すべてのリンクが逆になっている  上のk個の要素  、例えばL.を、与えられ  ているL 1→2→6→3→4→5、もし  K = 3、あなたマスト出力3→2→1→6→5→4。場合  Kは= 4、あなたを出力しなければならない4→3→2→1→5→6。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は最初のノードのアドレスを含む、正  N(ノードの総数である≤)、および正  K(サブリストの長さ≤)反転します。ノードのアドレスは、5桁の非負整数であり、NULLは-1で表されます。

次いで、  Nラインは、次のそれぞれの形式におけるノードを記述する。

Address Data Next
 

ここで、  Address ノードの位置は、  Data 整数であり、  Next 次のノードの位置です。

出力仕様:

それぞれのケースでは、出力は、結果はリンクリストを命じました。各ノードは、回線を占有し、そして入力と同じ形式で印刷されます。

サンプル入力:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
 

サンプル出力:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

グッド天!リストの書き込み1日

 

 

#include <iostreamの> 
する#include <stdio.hの>
 使用して 名前空間STD; 

ストラクトノード
{ 
    INT numは、
     INT次に; // 次のアドレス 
}リスト[ 100001 ]; // アドレス100,000初めとして

ボイドプリント(INT N-)
{ 
    IF(N - == - 1 ){ 
        COUT << - 1。;
         リターン; 
    } 
    int型 T = 10000 ;
     一方、(T)
    { 
        COUT << N- / T。
        N= N%T。
        T = T / 10 
    } 
} 

int型のmain()
{ 
    int型FIR、N、K。
    scanf関数(" %D%D%D "、&​​FIR、&N&K)。
    // cinを>>モミ>> N >> K; 
    リスト[ 100000 ] .Next = モミ。
    INT iは= 0 ; I <N ++ I)
    { 
        int型 T1、T、T2。// cinを>> T1 >> T >> T2; 
        scanf関数(" %D%D%D "、&​​T1、&T、&T2)。
        リスト[T1]。 
        リスト[T1] .Next = T2。
    } 
    INT P1 =リスト[FIR] .Next、P2 =リスト[FIR] .Next、P3 =モミ、P4 = 100000 一方、1 
    { // COUT << "P4 =" << P4 << "P3 = "<< P3 <<" P2 = "<< P2 <<" P1 =" << P1 << ENDL。
        INTフラグ= 1 以下のためにINT iが= 1 ; I <Kを、I ++ 
        { 
            場合(P1 =! - 1 
            { 
                P1 = リスト[P1] .Next。
                リスト[P2]。次= P3。
                P3=P2; 
                P2 = P1。
            } 
            
            { 
                フラグ = 0 休憩; 
            } 
            // COUT << "aaP4 =" << P4 << "P3 = "<< P3 <<" P2 = "<< P2 <<" P1 =" << P1 << ENDL。
        }
         であれば(フラグ)
        { 
            int型、Y = リスト[P4] .Next。
            リスト[P4] .Next = P3。
            P3 = Y。
            // coutの<< "P3 =" << P3 <<てendl;
            // のための(INT J = 1; J <K。++ J)P3 =リスト[P3] .Next。
            リスト[P3] .Next =PL;
             // 復元 
            P4 = P3、
            P3 = P2;
             IF(P2 == - 1BREAK ; // ちょうど終了 
            PL = リスト[PL] .NEXT; 
            P2 = リスト[P2] .NEXT;
             // COUT << "P4 =" << << P4 "P3 =" P3 << << "P2 =" P2 << << "PL =" << ENDL << P1の; 
        }
         そう// 末端テール離脱動作を(有しますデバッグ:マルチステップバック、ああA)
        {
             一方(P3 =!リスト[P4] .NEXT)!!! // 
            { 
                // P1の= P2。
                P2 = P3。
                P3 = リスト[P3] .Next。
                リスト[P2] .Next = P1。
                P1 = P2。
            } 
            ブレーク; 
        } 
    } 
    // COUT << ENDL。
    int型 P = 100000 ;
    一方、1 
    { 
        P = リスト[P] .Next。
        印刷(P)。
        裁判所未満 << "  " <<一覧[P] .Num << "  " ; 
        印刷(リスト[P] .Next)。
        coutの << てendl;
        もし(リスト[P] .Next == - 1ブレーク
    } 


    戻り 0 
}

 

 

 

おすすめ

転載: www.cnblogs.com/liuyongliu/p/12466163.html