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将是两个独立的变量,指向堆中的同一个对象。因此,如果您head在方法中为变量分配新值,则另一个 ( oddHead) 将保持不变。对于所有其他传递的参数也是如此。

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

于 2013-08-27T06:42:32.197 回答