关于实施双重链表的参考文献的混淆

时间:2016-02-01 16:30:09

标签: java data-structures reference

我正在尝试自己实现的双链表。虽然我的代码目前正在运行,但我无法弄清楚原因。下面是代码的一部分:

public class DLList<E> {

    public class Node {
        /** The contents of the node is public */
        public E elt;

        protected Node prev, next;

        Node() {
            this(null);
        }

        Node(E elt) {
            this.elt = elt;
            prev = next = null;
        }
    }

    Node first, last;

    DLList() {
        first = last = null;
    }

       // inserts an element at the beginning of the list 
    public Node addFirst(E e) {
        Node node = new Node(e);
        if(first==null){
            first = node;
            last = node;
        }else{
            node.next = first;
            first.prev = node;
            first = node;
        }
        return node;
    }
}



在addFirst函数的else-block中,变量next设置为引用first,后两行将引用first设置为Node-object node 。 Surspringly(对我来说)这个作品。这不应该意味着node.next实际设置为node,因为我们基本上得到node.next = first = node吗?

编辑: 回答:
你正在改变引用(指针) - 这就是它工作的原因。最后一行first = node;只是将first更改为指向上一个节点以指向当前节点。 - alfasin

我想我明白了。在我的代码中,我没有改变实际的对象,我只是改变了被引用的对象。用简单的英语,我在else块中的代码可以理解为:
1.设置node.next以引用first引用的对象。
2.设置first.prev以引用node引用的对象。
3.最后,重新分配first以引用node引用的对象。 - erikejan

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些问题,如评论中所述,但要回答您的问题,不,它不一样。 在Java中,您可以按值而不是按引用分配变量。因此,如果在将first分配给node后进行修改,则不会修改node的值。 1}}。

就像是,

a = 5;
b = a;
a = 4;

此处,b的值为5。它不会更改为4。 编译器按顺序执行每个语句。因此,它不会知道将来会修改a的值。