空のノードに発生した問題は、Javaデータ構造とアルゴリズムの教科書の補間コードのデモバージョンを率います。最初のコード。
Objectlist
インポートjava.util.Scanner; パブリック クラス ListLinked <T> { ListLinkedNode <整数> =ヘッド新しい新しい ListLinkedNode <整数>(); // 宣言ヘッドノード // ノードを追加する 公共 ボイド addFromHead(INT E){ ListLinkedNode <整数> P = 新しい新しい ListLinkedNode <整数>(); // 宣言し、作成し、ノードpはノード挿入ある p.setData(E); p.setNext(head.getNext()); head.setNext(P); // 後のヘッドノードPに挿入 } // リストヘッド補間作成 パブリック 静的 ListLinked <整数>createFromHead(){ ListLinked <整数> = listLinked 新しい新しい ListLinked <>(); // リストを初期化 するSystem.out.println( " -リストの先頭補間を確立する- " ); System.out.printlnはは(「鎖長を入力してください: " ); スキャナSC = 新しい新しいスキャナ(System.in); // N-:チェーンの長さの int型 N- = sc.nextInt(); System.out.printlnは( "値を入力してください: " ); のため(int型 Iに= 0; I <N-; I ++は){ System.out.printの( + 1つのI(+ "を入力してください")+ " 値:" ); int型 E = SC。nextInt(); listLinked.addFromHead(E); } のSystem.out.println( "链表创建完毕" )。 リターンlistLinked; } // 输出 公共 ボイドディスプレイ(){ System.out.printlnは( "{" )。 ListLinkedNode <整数> P = 新しい ListLinkedNode <整数> (); P = head.getNext()。 一方、(!p = NULL ){ int型値= p.getData()。 System.out.println(値)。 P = p.getNext()。 } のSystem.out.println( "}" )。 } }
ノードクラス
パブリック クラス ListLinkedNode <T> { // データメンバー のプライベートTデータ、 プライベート ListLinkedNode <T> 次; // データフィールドを取得し 、公共TのgetData(){ 返すデータを; } // データフィールド設定 パブリック 無効にsetData(T Data)を{ この .DATA = データ; } // 取得ポインタフィールド パブリック ListLinkedNode <T> getNextを(){ 戻り次のページを; } //はポインタフィールド設定 パブリック ボイド SetNext(ListLinkedNode <T>を次){ この .next = ;次 } // 引数コンストラクタ有する 公共ListLinkedNode(Tデータ){ この .DATA = データと、 この .next = NULL ; } // 引数なしコンストラクタ パブリックListLinkedNode(){ } }
テストカテゴリ
パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ ListLinkedリスト = 新しいListLinked()。 list.createFromHead(); list.display(); } }
試験した場合、出力の実装は、pがNULLであった場合、pが空であるか否かが判定されます。
ブレークポイントのデバッグは、私が問題に気づきました。
ポインタなどのJava参照型ため、addFromHeadにおける方法では、次の先頭アドレスにオブジェクトpを保存します。
addFromHead方法、ローカル変数pのライフサイクルの終わりには、ガベージコレクションメカニズムによって奪われた場合
ごみは、次の頭を奪われたような変数は、ヒープ上のpオブジェクトの前を指す何スタック、ヒープ・オブジェクトも使用されていない、それがnullであります