未更新链表的头节点



我一直在使用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

最新更新