public class Node<T> {
T data;
Node<T> next;
Node(T data){
this.data = data;
}
}
public class LinkedListUse{
public static void print(Node<Integer> head){
Node<Integer> temp = head;
while(temp != null){
System.out.print(temp.data +" ");
temp = temp.next;
}
System.out.println();
}
public static void increment(Node<Integer> head){
Node<Integer> temp = head;
while(temp != null){
temp.data++;
temp = temp.next;
}
}
public static void main(String args[]){
Node<Integer> node1 = new Node<Integer>(10);
Node<Integer> node2 = new Node<Integer>(20);
node1.next = node2;
increment(node1);
print(node1);
}
}
由于函数increment
中的node1
是按值传递的(而不是按引用传递的(,因此根据我的说法,输出应该是1020,但解决方案是1121。
你能帮我解释一下这个背后的原因吗
对increment
的调用将使列表发生变化。也许这有助于将列表可视化。在执行node1.next = node2
之后,我们得到这样的情况:
node1 node2
↓ ↓
┌───────────┐ ┌───────────┐
│ data: 10 │ │ data: 20 │
│ next: ──────> │ next: null│
└───────────┘ └───────────┘
然后increment(node1)
将定义另外两个引用node1
的变量:
head
temp
node1 node2
↓ ↓
┌───────────┐ ┌───────────┐
│ data: 10 │ │ data: 20 │
│ next: ──────> │ next: null│
└───────────┘ └───────────┘
在while
循环中,它将首先递增temp.data
(因此它变为11(,然后将temp
引用移动到node2
:
head temp
node1 node2
↓ ↓
┌───────────┐ ┌───────────┐
│ data: 11 │ │ data: 20 │
│ next: ──────> │ next: null│
└───────────┘ └───────────┘
在第二次迭代中,node2
(=temp
(的data
将递增,并且temp
移动到temp.next
,即null
:
head temp==null
node1 node2
↓ ↓
┌───────────┐ ┌───────────┐
│ data: 11 │ │ data: 21 │
│ next: ──────> │ next: null│
└───────────┘ └───────────┘
因此,尽管对temp
的更改不会影响对node1
的引用,但对引用节点的任何突变都将保留,即使在对increment
的调用完成执行之后也是如此。再也没有10的值了,也没有20的值了。这些已被覆盖。
当调用print
方法时,会发生与调用increment
时类似的事情,只是现在节点没有发生突变。它将找到调用increment
时留下的节点。没有其他节点。