2

これが私のアルゴリズムのコードです:

public void insert(int element) {
    _insert(element, root);
    System.out.println(root);
}

private void _insert (int element, Node t) {
    if (t == null) {
        t = new Node(null, element);;
        return;
    }
}

Nodeこれが事前定義されたクラスです。

publicメソッドinsertが呼び出されると、privateメソッドが呼び出され、ツリーが空かどうかがチェックされます。その場合、新しいノードがそのroot位置に作成されます。

出力はノードであると想定されています。ただし、実際の出力はnull、ルートがtとしてプライベートメソッドに渡されても更新されないことを意味します。

これは、ポインタを使用したC++で機能するはずです。たぶん私はJavaで何かを誤解していますか?

4

2 に答える 2

6

Javaは、メソッド呼び出しに常に値渡しを使用します。参照型をメソッドに渡すと、参照のコピーが作成されます。

次の行はt、新しいオブジェクトを参照するように変更されていますが、元の変数は変更されていませんroot

t = new Node(null, element);

次のように、挿入されたノードを返すようにメソッドを変更できます。

private Node _insert (int element, Node t) {
    if (t == null) {
        t = new Node(null, element);
    }
    return t;
}

そして、このように呼び出します:

root = _insert(element, root);
于 2012-08-12T00:51:54.870 に答える
-1

Javaでは、参照はC++ポインターと参照を組み合わせたものです。C ++ポインタのように動作する場合もあれば、C++参照のように動作する場合もあります。割り当てを行うとき、関数に引数として渡されるとき、または等価性テストで使用されるときは、ポインターのように動作しますが、メンバーにアクセスするときは、C++参照のように動作します。つまり、Javaでtxを記述することは、常にC / C++のポインターのt->xと同等のように解釈されます(またはC ++参照のtxですが、Javaとは異なり、C ++参照はポインターのように動作しません)。

さらに、Javaおよび一般的なオブジェクト指向プログラミングでは、ほとんどの人は空のリストをnull変数で表すことを良い考えとは考えていません。初期化されると、変数は常に完全に機能するオブジェクトを参照する必要があるため、空のリストはオブジェクトの内部状態によって識別される必要があります。null参照を使用することではありません。関数の戻り値を使用して、それ自体が引数として同じ関数に渡されるノードを再割り当てすることは、古き良きC / C ++のハッキングに似ており、適切な最新のオブジェクト指向設計に似ています。したがって、代わりに:

root = _insert(root, element);

次のように書く必要があります。

MyList root = new MyList();
root._insert (element);

そしてあなたのクラスのどこかMyList:

private void _insert (int element) { 
  if (this.endNode == null) { 
      this.endNode = new Node(); 
  } else {
      this.endNode.nextNode = new Node();
      this.endNote = this.endNote.nextNode;
  }

  this.endNode.element = element;
}

_insert関数でリンクリスト内の任意の位置に要素を挿入できるようにする場合は、ノードの親を通過するか(または、要素を最初の位置に挿入する場合はnull)、doubleを使用する必要があります。リンクリスト。

ところで、Javaには、基本的なニーズを隠蔽できるはずのツリーとリストを表すためのコレクションのフルセット(ジェネリックと非ジェネリックの両方)がすでにあります。

于 2012-08-12T04:41:51.623 に答える