更新单链接列表

时间:2019-05-11 05:13:56

标签: java singly-linked-list

我试图基于参考链接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)的方式!

可能是一个愚蠢的问题,但是像这样如何发生却变得疯狂! :(

1 个答案:

答案 0 :(得分:2)

添加第一个元素时,头部和尾部都指向同一元素。添加第二个元素时,tail.setNextRef(nd)将等于head.setNextRef(nd),因为tail和head具有相同的引用。之后,tail = nd,这意味着tail现在指向当前节点,并且从该点开始,将通过tail.setNextRef(nd)设置当前节点的下一个节点,紧接在那之后,tail将会具有新的当前节点的引用。

我希望这可以澄清。