2013-05-05 23 views
0

首先,我需要一个解释而不是解决方案。正如您从代码中看到的,我正在尝试将MovieNode插入到MovieList中。该方法在MovieList类中。 “列表”是我保留我的MovieNodes的地方。如何在插入后在链表中建立连接

public void insert(Movie movie, int index) 
{ 
    MovieNode node = new MovieNode(movie); 
    MovieNode element; 
    MovieNode current = list; 

    while(current.previous != null) 
     current = current.previous; 
    element = current; // first node in the list 

    for(int n = 1; n < index; n++) 
     element = element.next; // determines where to put new node 

    node.next = element; 
    element.previous.next = node; 

} 

上面的方法似乎工作。但是,当我改变这条线

element.previous.next = node; 

与这一个;

element = node; 

插入后链接列表没有变化。在我看来,element.previous.next与元素本身是一样的,因为当我们用元素替换元素时,我们也改变了列表中元素之前的节点的后继。我们将继任者指向我们的新元素,即节点。我对这个问题很陌生,所以我很抱歉我可能犯的错误。

回答

0

elementreferenceMovieNodeelement.previous.next是另一参考相同MovieNode。这两者之间的区别在于element是您的函数范围内的临时引用;然而,element.previous.next是在此范围之外定义的element.previous节点所持有的参考。

重要的是要记住,在Java中说a = b是非常重要的,其中ab是对象,意味着ab指向同一个对象。如果修改a,则b也将更改。

这就是为什么您在函数的开头复制了MovieNode:为了有效地复制节点而不是引用它。其余的情节只是操纵previousnext引用,并不处理实际的对象。

+0

感谢您的解释。现在我更了解它。 – Riemann 2013-05-05 20:24:26

+0

不客气。我刚读了你对欧根的回答的评论。你是对的,你只在正向连接节点。这是双向链接的双向链表,通常与这种类型的列表你应该保持对两端的引用。 – Anthony 2013-05-05 20:42:47

+0

再次感谢。根据你的回答,我只写了删除方法,它工作得很好。我实际上不明白在Java中的引用,直到我看到你的解释:)。 – Riemann 2013-05-05 20:49:43

1

是有区别的:

element.previous.next = node; 

将使先前的元素下一字段指向节点,即,它会改变以前元件。

element = node; 

将只与分配(新)节点的局部变量元素 - 所以它是接近于无操作。

+0

感谢您的快速回复。我刚刚意识到我还必须添加“node.previous = element.previous;”行到我的代码。我的意思是,当我将元素前面的节点连接到新节点时,我还必须进行反向连接。在我看过要学习这个主题的视频中,他们只是说当你向链表插入一个新节点时,你必须首先将这个新节点的后继者指向给定插入索引处的节点,然后用新的一个。无论如何要以更简单的方式进行插入操作? – Riemann 2013-05-05 20:07:22