1

これは、教科書の実装のリンク リスト クラスのスニペットです。

public class ListItem
{
  Object   item;                  
  ListItem next;                  

  public ListItem(Object item) 
  {
    this.item = item;             
    next      = null;                  
  }
}

再帰のように見えます-クラスには、という名前のListItemインスタンス変数ListItemあります。この再帰を呼ぶのは適切ですか?

Pascal で連結リストを定義した方法を次に示します。再帰 ( pNodeType、別名^NodeType) と呼ばれるもののヒントが見られますが、上記の Java スニペットのようには感じられません。

type
    **pNodeType** = ^NodeType ;  

    NodeType = record        
      name : string ;        
      next : **pNodeType** ;  // conceptually, change the type to **^NodeType**
    end ;

Javaにはポインターがなく、オブジェクトは参照であるため、結局同じものを見ていると思います。右?

したがって、二重にリンクされたリスト (後方も) が必要な場合は、次のようにインスタンス変数を追加します。

ListItem prev;

次のようにコンストラクターにコード行を追加します

prev = null;

フォワードリンケージを機能させたのと同じ量の注意を払います。

右?

最後に、一般的なリンク リストが必要な場合は、スニペットをそのように変更し、メソッド内のすべての "Object" を "E" に変更します):

public class ListItem<E> {

  E item;                    
  ListItem next;                     

  public ListItem(E item) {
    this.item = item;                              
    next = null;                                   
  }
}

右?

4

1 に答える 1

1

再帰はありません。

クラスと同じ型のフィールドを宣言している間、インスタンスをインスタンス化しません。


コンストラクターに初期化が含まれていた場合:

next = new ListItem(null);

または、宣言に初期化が含まれていました。

ListItem next = new ListItem(null);

再帰があるだろう


一般的な質問に関しては、フィールドも入力する必要があります。

public class ListItem<E> {

  E item;                    
  ListItem<E> next;  // Added generic parameter                

  public ListItem(E item) {
    this.item = item;                              
  }
}

コーディングする必要がないことに注意してください。

next = null;  // redundant

デフォルトの初期化値はすでに null であるためです。

于 2013-10-03T23:37:59.013 に答える