2014-11-06 138 views
0

在下面的数据结构为什么仅仅改变这个数据结构中的nextNode是不够的?

public class ListNode<T> { 
    T data; 
    ListNode<T> nextNode; 

    ListNode(T object) { 
     this(object, null); 
    } 

    ListNode(T object, ListNode<T> node) { 
     data = object; 
     nextNode = node; 
    } 

    public T getData() { 
     return data; 
    } 

    public ListNode<T> getNextNode() { 
     return nextNode; 
    } 
} 

public class List<T> { 
    private ListNode<T> firstNode; 
    private ListNode<T> lastNode; 
    private String name; 

    public List() { 
     this("list"); 
    } 

    public List(String listName) { 
     name = listName; 
     firstNode = lastNode = null; 
    } 

    public void insertAtFront(T insertItem) { 
     if(isEmpty()) firstNode = lastNode = new ListNode<T>(insertItem); 
     else firstNode = new ListNode<T>(insertItem, firstNode); 
    } 

    public void insertAtBack(T insertItem) { 
     if(isEmpty()) firstNode = lastNode = new ListNode<T>(insertItem, null); 
     else lastNode = lastNode.nextNode = new ListNode<T>(insertItem) 
    } 


} 

为什么是不够的insertAtBack方法来做到这

 else lastNode.nextNode = new ListNode<T>(insertItem) 

? (我也是不知道什么a = b = c = something在java中的意思。)

+0

因为如果你这样做,'lastNode'不会是最后一个节点。 – immibis 2014-11-06 22:13:30

回答

2

这是不够的只是这样做:

else lastNode.nextNode = new ListNode<T>(insertItem) 

因为List需要跟踪它的第一个和最后节点。在后面插入时,必须更新lastNode,否则lastNode将引用“旧”最后一个节点,现在倒数第二个节点。

如果列表最初为空,那么第一个和最后一个节点都不会设置为任何值;他们必须被初始化。

a = b = c = something语法将最后一个值/表达式分配给所有不是最后的变量,从右到左关联,例如, something分配给c,然后b,然后a

+0

但不应该lastNode.nextNode总是指向空?我的意思是在这种情况下lastNode.nextNode指向lastNode。这对我来说看起来有点奇怪。 – qed 2014-11-06 22:18:45

+0

这就是为什么多个'='的顺序很重要。当执行'lastNode.nextNode ='时,'lastNode'仍然是旧的最后一个节点,所以旧的最后一个节点指向新的节点。然后执行'lastNode =',将'lastNode'更新到新节点。 – rgettman 2014-11-06 22:22:34

+0

重写它可能更清楚,没有复合赋值。 – 2014-11-06 22:37:57

0

所有信贷@rgettman,我将增加一个例证为自己和读者:

enter image description here

相关问题