链接列表的头节点未更新

时间:2014-10-30 06:49:29

标签: java data-structures linked-list singly-linked-list

我一直在使用 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 节点是一个全局变量,可以从任何函数访问。

2 个答案:

答案 0 :(得分:2)

  

为什么列表的头节点没有正确更新?

因为您只是更改局部变量的值。那是所有你正在做的事情 - 你根本没有对列表对象进行任何改动。对局部变量的更改在方法本身之外没有任何影响。

请注意,当我说“更改局部变量”时,我的意思是:

localVariable = someOtherValue;

如果你有:

localVariable.someMember = someOtherValue;

然后可能在方法之外产生影响,因为它正在改变对象的成员。如果该对象可以在方法外部访问,那么更改也将在那里可见。

答案 1 :(得分:1)

好吧,如果你不改变源列表的头部,仍然指向相同的第一个元素,但第一个元素已经指向目标列表的开头。

因此,目标列表看起来没有变化(因为你没有改变它的头部),源列表以相同的头部开头,但继续使用目的地列表的元素。

LL1.head -> 1->2->3

            ^
            | 
LL2.head -> 4 5->6