我一直在使用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.-头节点是一个全局变量,可以从任何函数访问。
为什么列表的头节点没有得到正确更新?
因为你只是在改变局部变量的值。这就是你所做的全部——你根本没有对列表对象进行任何更改。对局部变量的更改在方法本身之外没有任何影响。
请注意,当我说"更改为局部变量"时,我的意思是:
localVariable = someOtherValue;
如果你有:
localVariable.someMember = someOtherValue;
那么可能会在方法之外产生效果,因为这会更改对象的成员。如果该对象在方法之外是可访问的,那么更改也将在那里可见。
如果不更改源列表的头,is仍然指向相同的第一个元素,但第一个元素已经指向目标列表的开头。
因此,目标列表看起来没有变化(因为您没有更改其标题),源列表以相同的标题开始,但以目标列表的元素继续。
LL1.head -> 1->2->3
^
|
LL2.head -> 4 5->6