我一直在使用 Java 在名为 MoveNode() 的链接列表中实现一个简单的实用程序函数。
MoveNode()的主要目的是删除一个链接列表的第一个节点(源列表),并将其添加到另一个链接列表(目标列表)的开头。
示例如下:
Destination_Linked_List = {1,2,3}
Source_List_List = {4,5,6}
致电MoveNode(Destination_Linked_List,Source_List_List)
后,我们得到:
Destination_Linked_List = {4,1,2,3}
Source_List_List = {5,6}
以下是我上面的 Java 实现:
static void MoveNode(LinkedList LL1,LinkedList LL2)
{
Node sourceref = LL2.head;
Node destref = LL1.head;
Node temp = sourceref.next;
sourceref.next = destref;
LL1.head = sourceref;
LL2.head = temp;
}
完美运作!!
但是,如果我更改代码的最后两行并将其替换为本地Node
变量,则输出会完全更改。
这是:
如果我改变:
LL1.head = sourceref;
LL2.head = temp;
为:
destref = sourceref;
sourceref = temp;
通过执行此更改获得的输出是:
Destination_Linked_List = {1,2,3}
Source_List_List = {4,1,2,3}
异常背后的原因是什么?为什么列表的头节点没有正确更新?我错过了什么?
P.S。 - head 节点是一个全局变量,可以从任何函数访问。
答案 0 :(得分:2)
为什么列表的头节点没有正确更新?
因为您只是更改局部变量的值。那是所有你正在做的事情 - 你根本没有对列表对象进行任何改动。对局部变量的更改在方法本身之外没有任何影响。
请注意,当我说“更改局部变量”时,我的意思是:
localVariable = someOtherValue;
如果你有:
localVariable.someMember = someOtherValue;
然后可能在方法之外产生影响,因为它正在改变对象的成员。如果该对象可以在方法外部访问,那么更改也将在那里可见。
答案 1 :(得分:1)
好吧,如果你不改变源列表的头部,仍然指向相同的第一个元素,但第一个元素已经指向目标列表的开头。
因此,目标列表看起来没有变化(因为你没有改变它的头部),源列表以相同的头部开头,但继续使用目的地列表的元素。
LL1.head -> 1->2->3
^
|
LL2.head -> 4 5->6