2014-10-30 104 views
0

我一直在执行中链表简单实用函数调用MoveNode()使用的Java更新。节点没有得到

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} 

Wha t是背后的原因异常?为什么列表的头节点没有正确更新?我错过了什么?

P.S. - 节点是一个全局变量,可以从任何函数访问。

回答

2

为什么名单的头节点不能得到适当的更新?

因为你只是改变局部变量的值。这是全部你正在做的 - 你根本没有对列表对象做任何改变。本地变量的改变对方法本身没有影响。

需要注意的是,当我说“更改为局部变量”我的意思是这样的:

localVariable = someOtherValue; 

相反,如果您有:

localVariable.someMember = someOtherValue; 

那么威力有法外的效果,因为这正在改变对象的成员。如果该对象在方法外部可访问,则更改也会在该方法中可见。

+0

好吧!得到它了。但是,请您详细说明对localVariable.someMember所做的任何更改如何更改实际值? – Daggerhunt 2014-10-30 07:02:55

+1

@Daggerhunt:它不会改变'localVariable'的值 - 它改变存储在'localVariable'的值所引用的对象中的信息。这就是要点 - 将变量看作纸片。假设一个局部变量和其他地方的变量都有我的家庭住址 - 就像我的房子一样。如果您使用局部变量导航到我的房子,然后将门涂成红色,那么使用另一张纸导航到我家的人也会看到红色的门。但如果你只是改变你的纸上的内容,他们就不会看到*那*。 – 2014-10-30 07:08:25

+0

优秀的解释。我现在明白你在说什么。 – Daggerhunt 2014-10-30 07:19:37

1

那么,如果你不改变源列表的头部,仍然指向相同的第一个元素,但是第一个元素已经指向了目的地列表的开始。

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

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

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

很好的解释。得到它了。 – Daggerhunt 2014-10-30 07:04:28