为什么列表即使通过值传递也会更新


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时留下的节点。没有其他节点。

相关内容

  • 没有找到相关文章