データ構造:単独リンクリスト逆転シリーズ8--

ビジネスニーズ:逆転リストを指すリスト先頭ポインタを考えます。実装プロセス:隣接ノード間の鎖ドメインを変更します。

例:

入力: 
1-> 2-> 3-> 4-> NULLの
出力
4-> 3-> 2-> 1-> NULL

入力
1-> 2-> 3-> 4-> 5-> NULLの
出力
5-> 4-> 3-> 2-> 1-> NULL

入力:NULL
出力:NULL

入力:1 - > NULL
出力:1 - > NULL

 

反復法:

空間複雑:O(1)時間計算:O(N)

図1に示すように、初期化3つのポインタ

事前に= NULL、CURR = *ヘッド、次= NULL

2、次のループを実行し、リストを反復処理

//現在の次回変更する前に、
//ストアの次のノード
の次= curr->次の

//ここで次電流の変化
、実際の逆転が起こる場所です//
curr->次=前のページ

//前方PREVとCURR一歩を移動する
前= CURR
CURR =次

以下は、アルゴリズムの実装プロセスであります:

// 反復Cリンクされたリストを逆にプログラム 
する#include <stdio.hに> 
する#include <STDLIB.H> / * リンクリストノード* / 構造体ノード
{ int型データ、
    構造体のノード* 次の; 
}。/ * 関数はリンクリスト逆にする* / ボイド逆を(構造体ノード** head_ref)
{ 構造体ノード* PREV = NULL;
    構造体のノード*現在= * head_ref。
    構造体のノード*次回= NULL; しばらく(現在!= 
    { //



    



    

     NULL)
        ストアの次の 
        次の=の電流> 次。

        // 現在のノードのポインタの逆 
        の電流>次= 前のページ; 

        // 移動ポインタ先1位。
        PREV = 現在; 
        現在 = 次回。
    }
     * head_ref = PREV。
} 

/ * ノードプッシュする機能* / 
ボイドプッシュ(構造体ノード** head_ref、INT NEW_DATA)
{ 
    構造体ノード* new_node =(構造体ノード*)はmallocはsizeof構造体ノード))。 
    new_node - >データ= NEW_DATA。
    new_node - >次=(* head_ref)。 * head_ref)= new_node。
} 


/ * リンクされたリストを印刷する機能* / 
ボイドがprintlist(構造体ノード* ヘッド)
{ 
    構造体ノード*のTEMP = ヘッド。
    一方、(!TEMP = NULL)
    { 
        のprintf(" %d個"、temp-> データ)。
        TEMP = temp-> 次。
    } 
    のprintf(" の\ n " ); 
} 

/ *機能上にテストするドライバプログラム* / 
int型のmain(){ 

    / * 空のリストから開始* / 
    構造体ノード*ヘッド= NULL; 

    (プッシュ・ヘッド、20 )。
    プッシュ(&ヘッド、4 )。
    (プッシュ・ヘッド、15 )。
    (プッシュ・ヘッド、85 )。

    printf(" 与えられたリンクリスト\ nを" ); 
    がprintlist(ヘッド)
    (リバースヘッド)
    printf(" 逆リンクリスト\ N ");
    がprintlist(ヘッド)

    リターン 0 ; 
}

 

出典:https://www.geeksforgeeks.org/reverse-a-linked-list/

おすすめ

転載: www.cnblogs.com/passedbylove/p/11442956.html
おすすめ