Javaの二重リンクリストデータ構造

経営分析の欠陥の道リンクリスト:

単独リストをリンクし、検索方向は一方向のみで、二重にリンクされたリストは楽しみまたは後方にすることができます

単独リンクリスト自体を削除することはできません、セカンダリノードに依存する必要があり、二重にリンクされたリストは、次の操作を実行でき自体を削除するので、単一のノードを削除する私たちのリストの前には、必ずノードを削除するノードの前に一時、TEMPを見つけます。

模式図

図の説明:

二重リンクリストトラバーサルの分析、アイデアの操作を削除、変更、追加します。

1)トラバーサル:方法と単一のリストとしてではなく、楽しみことができますが、また戻って見ることができます

2)追加 :(最後の双方向リンクリストにデフォルトで追加)

  • まず、二重リンクリストの最後のノードを見つけます
  • temp.next = newHeroNode。
  • newHeroNode.pre =温度;

3)変更:アイデアやオリジナルとして単独でリンクリストを

4)削除

  • それは二重にリンクされたリストであるので、あなたはノードを自己削除を達成することができますので
  • あなたは、このような一時として、このノードを削除したいダイレクト
  • temp.pre.next = temp.next。
  • temp.next.pre = temp.pre。

コードの実装:

カテゴリリストノード構造

// HeroNode2を定義し、各オブジェクトは、ノードHeroNodeのある
クラスHeroNode2 {
     公共 のint ; NO
     パブリック文字列名;
     パブリック文字列ニックネーム、
     公共 ; HeroNode2次に// デフォルトはNULLである次のノードを指すように
    パブリック HeroNode2プレ; // ポイントの前ヌルへのノードのデフォルト
     // コンストラクタ

    パブリック HeroNode2(INT NO、文字列名、文字列のニックネーム){
         これは .NO = NO;
         この .nameの= 名;
         この .nickname = ニックネーム; 
    } 

    //方法を表示するために、我々は再度のtoString 
    @Override
     パブリック文字列のtoString(){
         リターン "HeroNode [NO =" + NO + "NAME =" +名+ "ニックネーム="ニックネーム+ + "]" ; 
    } 

}

操作リストのカテゴリ:

// 二重リンクリストクラスの作成
クラスDoubleLinkedList { 

    //は、ヘッドノードを初期化し、頭を動かさないノードを、特定のデータが格納されていない
    プライベート HeroNode2ヘッド= 新しい新しい HeroNode2(0、「」、「」); 

    //は、ヘッドノードを返します
    公共HeroNode2 getHead(){
         戻りヘッド; 
    } 

    // 二重連結リストを横断する
     // 表示リスト[トラバース] 
    公共 ボイドリスト(){
         //は、リストが空であるか否かを判断する
        のiF(head.next == NULL ){ 
            のSystem.out .println( "空のリスト" );
             リターン; 
        } 
        //ヘッドノードは移動できないので、私たちは横断する補助変数を必要 
        HeroNode2のTEMP = head.nextを、
         しばらくtrueに){
             //を決定最後にリストか否かを
            IF(TEMP == NULL ){
                 BREAK ; 
            } 
            // 出力ノード情報
            のSystem.out.println(温度);
             // 一時シフトは注意する必要があります後に 
            一時= temp.next; 
        } 
    } 

    // 。最後に二重リンクリストのノードを追加し
    、公共 のボイドの追加(HeroNode2 heroNode){ 

        // ヘッド理由ノードは移動できないので、我々は補助トラバースTEMPを必要 
        HeroNode2のTEMP = ヘッド。
        // 最後見つけるためにリストをトラバース
        しながらtrueにする){
             // 最終のリストを見つける
            IF(temp.next == NULL){ //
                 ブレーク; 
            } 
            // 最後に見つからない場合、シフト一時後 
            TEMP = temp.next ; 
        } 
        // リストの最後に出口whileループ、TEMPポイントが場合
         // 二重連結リストを形成 
        temp.next = heroNodeと、
        heroNode.pre = TEMP; 
    } 

    // 二重リンクリストのノードの内容を見ることができるモディファイそして、ノード単独リンクリストの内容を変更
     // HeroNode2にちょうどノードタイプ
    公共 のボイドアップデート(HeroNode2 newHeroNode){
         // 空かどうかを判断する
        IF(head.next == NULL ){ 
            するSystem.out.println( "リストが空〜" );
             を返す; 
        } 
        // ない数に基づいてノードを変更する必要性を見つけ、
         / / 補助変数定義 
        HeroNode2のTEMP = head.nextと、
         ブールフラグに= falseに ; // ノードが発見するかどうかを示す
        一方をtrueに){
             がiF(TEMP == NULL ){
                 BREAK ; // 横断されたリスト
            }
             IF(temp.no == newHeroNode.noが){
                 // 検索 
                フラグ= trueにBREAK ; 
            } 
            TEMP = temp.next; 
        } 
        // フラグを使用して、ノード変更するか否かを判断する
        IF (フラグ){ 
            temp.name =をnewHeroNode.name; 
            temp.nickname = newHeroNode.nickname; 
        }  { // 見つからない 
            System.out.printf( "ノード番号%dが見つからない、N- \修正することができません" 、newHeroNode.no);  
        }
    }

    // 、二重にリンクされたリストからノードを削除する
     // 説明
     // 二重リンクリストの1、私たちは直接、あなたがこのノードを削除したい見つけることができます
     // に自分自身を削除し、2見つけたら
    公共 のボイド・デル(int型NO){ 

        // 裁判官現在のリストが空である
        場合(head.next == NULL){ // 空のリスト 
            するSystem.out.printlnは( "リストが空で、削除できません" );
             を返す; 
        } 

        HeroNode2 TEMP = head.next; // 補助変数(ポインタ)
        ブールフラグで= falseに ; // フラグが削除ノードであることが見出されている
        一方、真の){
             IF(TEMP == NULL){ // リストを有することが、最後の
                ブレーク; 
            } 
            IF(temp.no == NO){
                 // TEMPを発見する削除ノードの前のノード 
                フラグ=でtrueにする;
                 BREAK ; 
            } 
            TEMP temp.next =; // 一時シフト横断後
        }
         // フラグに分析
        IF(フラグに){ // 見つける
             // 削除することができる
             // [方法連結リスト]; temp.next = temp.next.nextを 
            temp.pre。次回=temp.next;
             // ここでは、我々は問題を抱えているコードだ?
             // それが最後のノードである場合は、次の文を実行する必要はありません、そうでない場合はnullポインタ
            のIF(!temp.nextは= ヌル){ 
                temp.next.pre = temp.pre; 
            } 
        } { 
            System.out.printf( "\ N-存在しない削除する%のDノード" 、いいえ); 
        } 
    } 
}

 

おすすめ

転載: www.cnblogs.com/MWCloud/p/11241469.html