此代码会转换链接列表,如: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;
}
}
答案 0 :(得分:1)
Java没有通过引用传递。它总是传递价值。当您将oddHead
变量传递给oddEvenSplitter()
方法时,实际发生的是oddHead
变量的副本,并从该点head
和oddHead
传递变量将是两个单独的变量,指向堆中的同一个对象。因此,如果您为方法中的head
变量分配新值,则另一个(oddHead
)将保持不变。对于所有其他传递的参数也是如此。
作为一种解决方案,您可以创建另一个对象(如DTO)并将所有需要的引用放入其中并将其传递给您的方法。然后,无论何时更改这些引用,您都可以使用调用方法获取它们。