0

このコードは、1-> 2 -> 3 -> 4 のようなリンクリストを 1->3-2->4 (つまり、左が奇数で右が偶数) に変換しますが、oddEvenSplitter関数によって引き起こされる問題は除きます。このコードは参照を値で変更します。入力が参照であるような状況でコードを再利用するにはどうすればよいですか?

public void oddEvenSplitter (Node head, Node current, Node temp) {
    if (head == null) {
        head = temp;
        current = temp;
    } else {
        current.next = temp;
        current = temp;
    }
}

public void oddFirst( ) {
    if (first == null) {
        throw new NoSuchElementException();
    }

    Node temp = first;
    Node oddhead = null;
    Node odd = null;
    Node evenhead = null;
    Node even = null;

    while (temp != null) {

        if (temp.element % 2 == 0) {
            oddEvenSplitter(evenhead, even, temp);
        } else {
            oddEvenSplitter(oddhead, odd, temp);
        }
    }

    if (oddhead != null) {
        odd.next = evenhead;
        first = oddhead;
    }

}
4

1 に答える 1

1

Java には参照渡しがありません。常に値を渡します。たとえば、oddHead変数をoddEvenSplitter()メソッドに渡すと、実際にはoddHead変数のコピーが渡され、その時点headからoddHead変数は 2 つの別々の変数になり、ヒープ内の同じオブジェクトを指します。headしたがって、メソッド内の変数に新しい値を割り当てると、もう一方 ( oddHead) は変更されません。これは、渡された他のすべてのパラメーターにも当てはまります。

解決策として、別のオブジェクト (DTO など) を作成し、必要なすべての参照をその中に入れて、メソッドに渡すことができます。その後、これらの参照を変更するたびに、呼び出し元のメソッドでそれらを取得できます。

于 2013-08-27T06:42:32.197 に答える