如果我改变方法以返回新链接列表的头部,它可以完美地工作。
这里有什么不对吗?
在这里你可以看到两个代码:
static void insertIter (simplyLinkedList head, int insert, Comparator cmp){
if (head == null) return;
simplyLinkedList last = null;
simplyLinkedList actual = head;
simplyLinkedList add = new simplyLinkedList(insert);
while (actual != null){
if (cmp.compareInt(insert, actual.key) == -1 || cmp.compareInt(insert, actual.key ) == 0){
add.next = actual;
if (last == null){
head = add;
}
else {
last.next = add;
}
return;
}
last = actual;
actual = actual.next;
}
if (actual == null){
last.next = add;
add.next = null;
}
return;
}
static simplyLinkedList insertIter (simplyLinkedList head, int insert, Comparator cmp){
if (head == null) return null;
simplyLinkedList last = null;
simplyLinkedList actual = head;
simplyLinkedList add = new simplyLinkedList(insert);
while (actual != null){
if (cmp.compareInt(insert, actual.key) == -1 || cmp.compareInt(insert, actual.key ) == 0){
add.next = actual;
if (last == null){
head = add;
}
else {
last.next = add;
}
return head;
}
last = actual;
actual = actual.next;
}
if (actual == null){
last.next = add;
add.next = null;
}
return head;
}
感谢您的帮助!
答案 0 :(得分:3)
在您的代码中,您更改了head
:
if (last == null){
head = add;
}
这会改变参数的值。它对调用代码的版本没有影响。例如,如果调用代码是
insertIter(foo, 1, someComparator);
... head
中更改insertIter
对foo
的值没有任何影响; foo
仍包含旧值。
由于您可能需要更改head
,因此您需要将其返回(如您所发现的),并执行此操作:
foo = insertIter(foo, 1, someComparator);
请记住,变量包含值,它是传递给方法的值,而不是变量。与对象相关的值称为对象引用。它类似于JVM用于在内存中定位对象的数字。上面foo
可能包含Ref55465
(我们从未看到这些实际值),即使您将head
中的值从Ref55465
更改为Ref66548
,{{ 1}}仍然包含foo
。