2012-04-03 16 views
1

は、私はJavaでリンクされたリストを習得しようとすると、以下のコードについていくつかの質問があったんだ:リンクされたリストにルートノードを作成する方法は?

public class List { 
    Node root; 
    public List() { 
     // constructor 
    } 

    public int pop() { 
     // pop logic 
    } 

    public int push(int data) { 
     // push logic 
    } 
} 

私が飛び出るとリンクリストにデータをプッシュするためのListクラスを持っているしたいと思います。しかし、リストにはインスタンス化に関するデフォルトデータがないので、ルートノードへの参照を格納する最良の方法は何でしょうか? Cでは

、私は同じようにポインタを持っているでしょう:

Node * root; 

しかし、Javaはポインタを持っていないので、のような単純な宣言持つでしょう:

Node root; 

を...受け入れられますか? Javaをしばらく使用していませんが、クラス変数として宣言されたオブジェクトにメモリを割り当てないと、潜在的なメモリの問題が発生します。ありがとう!

+1

変数には値が格納されます。非プリミティブ型の場合、これらの値は(内部的に)オブジェクトへの「参照」またはnullです。私は、「名前」という用語を使用することを好みます。 'ノードn1 =新しいノード();ノードn2 = n1; - >新しいノード "は、両方の変数が同じオブジェクトを"評価 "するので、" n1とn2(これは*同じ*ノードオブジェクトです)によって命名されます。この動作は、C/C++のポインタと同様です。非プリミティブ型の場合、代入(またはメソッドに渡す)に暗黙的なコピー/複製/クローンはありません。これはC++のコピーコンストラクタとは異なります。 –

答えて

3

はい、Node rootのような単純な宣言は可能です。これは実際にはポインタではなく、Nodeを参照する可能性のある参照です。

Javaの参照は、概念的にはCのポインタと同等ですが、柔軟性が低く、構文が単純です。

1

はい、

Node root; 

が許容されます。 Javaにおけるプリミティブでないオブジェクト(プリミティブやオブジェクトの配列を含む)は、実際にはオブジェクトへの参照であるため、多くの点でCポインタのようなものです。

実際には、この宣言自体が実際にオブジェクトを作成しているわけではない、ポインタに似ています。これはまだ何も指していない参照です。rootを最初にnew Node()に割り当てると、NullPointerExceptionが表示されます。

1

はい、Node root;は本当に問題ありません。 rootの値を変更しないでください。それを使用するには、別の変数を作成してパスをトラバースします。Node start = root;このようにしてrootは変更されません。

​​

いいえ。 Node root;を書くだけではメモリは割り当てられませんが、root = new Node();はメモリを割り当てません。 Javaのclass membersが静的​​であることに注意してください。非静的なメンバーはglobal variablesです。 Javaのグローバル変数にメモリを割り当てることは、一般的な方法です。たとえば、実際にリストを格納する変数になり、にはにメモリを割り当てる必要があります。

Javaは堅牢なメモリ管理システムを備えているため、メモリの問題が発生しにくくなります。

関連する問題