说我有一个简单的Node
类:
public class Node {
public Integer data = null;
public Node next = null;
public Node(int data) {
this.data = data;
}
}
现在我使用这个节点创建一个链表:
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
n1.next = n2;
n2.next = n3;
n3.next = n4;
这基本上是:1 -> 2 -> 3 -> 4 -> null
到目前为止一切顺利。现在,如果我是对的,则n1,n2,n3和n4保存存储Node
的相应实例的地址。所以我继续,并做到这一点:
n2 = n3;
即。将存储在n3中的地址也放入n2。
所以我希望输出列表如下:1 -> 3 -> 4 -> null
但我得到的输出仍然是:1 -> 2 -> 3 -> 4 -> null
。
我误解了什么?列表如何仍然完好无损?
答案 0 :(得分:3)
你基本上正在改变n2所指的不是n2.next。 n2和n2.next是指向2个不同对象的引用。您必须将n1.next设置为n3以获得您期望的行为。但是,n2.next仍将指向n3。
答案 1 :(得分:2)
链接列表的工作方式,您只需要对第一个节点进行完整的引用即可遍历列表。
所有行n2 = n3
正在做的是将n2中的引用从节点2更改为节点3,节点本身不变。
n1.next()
仍将等于第二个节点。
n1.next().next()
将等于第3个节点。
n1.next().next().next
将等于第4个节点。