如何在输入参数是引用的情况下重用代码?

时间:2013-08-27 06:13:21

标签: java linked-list

此代码会转换链接列表,如:1-> 2 - > 3 - >除了由oddEvenSplitter函数引起的问题之外,在图4中,进入1-> 3-2-> 4(即左边奇数,甚至右边)。此代码将按值修改引用。如何在输入是引用的情况下重用代码?

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;
    }

}

1 个答案:

答案 0 :(得分:1)

Java没有通过引用传递。它总是传递价值。当您将oddHead变量传递给oddEvenSplitter()方法时,实际发生的是oddHead变量的副本,并从该点headoddHead传递变量将是两个单独的变量,指向堆中的同一个对象。因此,如果您为方法中的head变量分配新值,则另一个(oddHead)将保持不变。对于所有其他传递的参数也是如此。

作为一种解决方案,您可以创建另一个对象(如DTO)并将所有需要的引用放入其中并将其传递给您的方法。然后,无论何时更改这些引用,您都可以使用调用方法获取它们。