我正在尝试自己实现的双链表。虽然我的代码目前正在运行,但我无法弄清楚原因。下面是代码的一部分:
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
答案 0 :(得分:0)
您的代码中存在一些问题,如评论中所述,但要回答您的问题,不,它不一样。 在Java中,您可以按值而不是按引用分配变量。因此,如果在将first
分配给node
后进行修改,则不会修改node
的值。 1}}。
就像是,
a = 5;
b = a;
a = 4;
此处,b
的值为5
。它不会更改为4
。
编译器按顺序执行每个语句。因此,它不会知道将来会修改a
的值。