微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么即使按值传递列表也会更新?

如何解决为什么即使按值传递列表也会更新?

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。