为什么我创建一个链表节点,附加一些数据,然后用另一个方法移动头部,头部在callee方法中保持不变?
例如:
public static void append(Node n, int d) {
while (n.next != null) {
n = n.next;
}
n.next = new Node(d);
}
public static void test(Node n) {
n = n.next;
}
public static void main(String[] args) {
Node head = new Node(5);
append(head, 4);
append(head, 3);
test(head); //this moves the head to head.next
//why is head still = 5 after we get here?
}
答案 0 :(得分:1)
在方法append
中,行n = n.next
不会影响作为参数传递的原始节点,在您的情况head
中。 为什么? Because Java is pass by value。这意味着如果在方法内部,您修改了head
的引用(在方法中作为n
接收),它将不会影响原始引用。因此,head
仍将引用内存中的相同位置(同一对象)。
此外,您的方法test
无法执行任何操作,因为您正在创建本地变量:
Node next = ...;
然后为其分配n.next
。但是这个变量只存在于该方法中,所以它不会影响它以外的任何东西。
答案 1 :(得分:0)
next
是属性,而不是方法。您的test
方法只是抓住对n.next
的引用,而不是“移动头部。”