我试图基于参考链接http://www.java2novice.com/data-structures-in-java/linked-list/singly-linked-list/了解LinkedList的实现。
他们在那里创建了一个如下的Node类:
class Node<T> implements Comparable<T> {
private T value;
private Node<T> nextRef;
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
public Node<T> getNextRef() {
return nextRef;
}
public void setNextRef(Node<T> ref) {
this.nextRef = ref;
}
@Override
public int compareTo(T arg) {
if(arg == this.value){
return 0;
} else {
return 1;
}
}
}
并实现了以下单链接列表:
public class SinglyLinkedListImpl<T> {
private Node<T> head;
private Node<T> tail;
public void add(T element){
Node<T> nd = new Node<T>();
nd.setValue(element);
System.out.println("Adding: "+element);
/**
* check if the list is empty
*/
if(head == null){
//since there is only one element, both head and
//tail points to the same object.
head = nd;
tail = nd;
} else {
//set current tail next link to new node
//When this line gets executed, it's also updating head variable's nextRef object. How that works?!?!
tail.setNextRef(nd);
//set tail as newly created node
tail = nd;
}
}
...
...
}
我无法理解何时执行以下行,它还在更新head变量的nextRef对象。怎么工作?!?!
tail.setNextRef(nd);
我尝试调试并查看对象的值,并注意到只有在head变量中,它们才会使用nextRef
添加给定的元素。但是在head.nextRef
步骤更新了tail.setNextRef(nd)
的方式!
可能是一个愚蠢的问题,但是像这样如何发生却变得疯狂! :(
答案 0 :(得分:2)
添加第一个元素时,头部和尾部都指向同一元素。添加第二个元素时,tail.setNextRef(nd)将等于head.setNextRef(nd),因为tail和head具有相同的引用。之后,tail = nd,这意味着tail现在指向当前节点,并且从该点开始,将通过tail.setNextRef(nd)设置当前节点的下一个节点,紧接在那之后,tail将会具有新的当前节点的引用。
我希望这可以澄清。