问题描述
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);
}
}
由于 node1
在函数 increment
中已按值传递(而不是按引用传递),因此根据我的说法,输出应为 10 20,但解决方案是 11 21。>
你能帮我解释一下这背后的原因吗
解决方法
对 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│
└───────────┘ └───────────┘
在第二次迭代中,data
(= node2
) 的 temp
将递增,temp
移动到 temp.next
,即 {{1} }:
null
因此,尽管对 head temp==null
node1 node2
↓ ↓
┌───────────┐ ┌───────────┐
│ data: 11 │ │ data: 21 │
│ next: ──────> │ next: null│
└───────────┘ └───────────┘
的更改不影响 temp
的引用,但对 引用节点 的任何更改都将保留,即使在调用 {{1 }} 已完成执行。没有地方再有 10 的值,也没有 20。这些都被覆盖了。
当调用 node1
方法时,会发生与调用 increment
时类似的事情,只是现在没有给节点带来任何变化。它将找到调用 print
时留下的节点。没有其他节点。