gpt4 book ai didi

java - java中单链表的赋值

转载 作者:行者123 更新时间:2023-12-02 01:15:04 27 4
gpt4 key购买 nike

我们有以下方法在java中合并两个单链表

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//the next node of dummy will be pointing at the final result so it is easier to return
ListNode dummy = new ListNode(0);
ListNode result = dummy;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
result.next = l1;
l1 = l1.next;
} else {
result.next = l2;
l2 = l2.next;
}
result = result.next;
}

if (l1 != null) {
result.next = l1;
} else {
result.next = l2;
}

return dummy.next;
}
}

我的问题是在将虚拟值分配给结果后,虚拟值随着结果的变化而变化。直观上这是正确的,因为当我访问下一个结果时,我正在访问下一个虚拟值。

但是,当我有像 int a = 5; 这样的作业时并更改重新分配 a = 6 ,显然我们不会得到5 == 6

或者如果我这样做result = ListNode(1) ,我的猜测是 dummy 不会更改为 ListNode(1)

它们的区别背后的逻辑是什么?

最佳答案

变量的“盒子”隐喻适用于原始值 - 想象一个名为 a 的盒子,将数字 5 放入其中,然后创建一个名为 b 的盒子并将 a 中的 5 复制到该框中。现在您可以在 a 中输入不同的数字,但 b 框中的数字仍然是 5。

当变量保存对对象(例如ListNode)的引用时,这个隐喻就失效了,因为对象实际上与原始值不是同一类型的东西;对象本身永远不会存储在变量“中”。当您编写像 ListNode dummy = new ListNode(0); 这样的代码时,您并不是在创建一个对象并将其存储在名为 dummy 的框中 - 您正在创建一个对象并存储对它的引用位于名为dummy的框中。

为了更好地类比,请考虑家庭住址。创建一个名为 dummy 的框,并在其中输入您 friend 家的地址。然后创建另一个名为 result 的框,并将该地址的副本放入新框中。现在,如果您的下一条指令是“前往 dummy 框中地址处的房子并将其涂成蓝色”,那么您应该不会感到惊讶,之后, 中地址处的房子就会出现。 result 框也被漆成蓝色;毕竟他们是同一所房子。

关于java - java中单链表的赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58790024/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com