为什么头指针在覆盖当前头节点时会失去对链表的跟踪
Why does the head pointer lose track of the linkedlist when overwriting the current head node
比较:
public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
{
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
dummy.next = list1;
list1 = list1.next;
}
else
{
dummy.next = list2;
list2 = list2.next;
}
dummy = dummy.next;
}
if (list1 == null)
{
dummy.next = list2;
}
else if (list2 == null)
{
dummy.next = list1;
}
return head.next;
}
收件人:
public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
{
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
dummy = list1;
list1 = list1.next;
}
else
{
dummy = list2;
list2 = list2.next;
}
dummy = dummy.next;
}
if (list1 == null)
{
dummy.next = list2;
}
else if (list2 == null)
{
dummy.next = list1;
}
return head.next;
}
head 指向虚拟 ListNode 的方式有何不同。
我的理解是不使用 dummy.next = list1 而只是让 dummy = list1,我们实际上是在重写 dummy 的当前值。然后当我们到达:
dummy = dummy.next;
Dummy 将等于 null。因此,当我们进入循环的下一次迭代时,我们会将 null 重新分配给 list1 中的任何节点。那么,当我们这样做时,为什么 head 无法跟踪 dummy 呢?是因为我们将 dummy 的第一个节点分配给不同的列表吗?
您只能通过为节点的属性赋值来改变列表,而不是通过为局部变量赋值。
就像 list1 = list1.next
不会 改变 list1
,而只是将引用移动到该列表中的下一个节点,所以 dummy = list1
也不会更改该列表。它只是设置一个节点的引用;该列表中没有任何变化。
所以在你的第二个版本中,dummy
开始作为对值为 -1 的节点的引用,但随后在循环的第一次迭代中 放弃 该节点,并引用 list1
中的另一个节点。因此,值为 -1 never 的节点将任何分配给它的 next
成员的东西都保留 null
直到函数执行结束。
比较:
public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
{
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
dummy.next = list1;
list1 = list1.next;
}
else
{
dummy.next = list2;
list2 = list2.next;
}
dummy = dummy.next;
}
if (list1 == null)
{
dummy.next = list2;
}
else if (list2 == null)
{
dummy.next = list1;
}
return head.next;
}
收件人:
public static ListNode mergeTwoLists(ListNode list1, ListNode list2)
{
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (list1 != null && list2 != null)
{
if (list1.val < list2.val)
{
dummy = list1;
list1 = list1.next;
}
else
{
dummy = list2;
list2 = list2.next;
}
dummy = dummy.next;
}
if (list1 == null)
{
dummy.next = list2;
}
else if (list2 == null)
{
dummy.next = list1;
}
return head.next;
}
head 指向虚拟 ListNode 的方式有何不同。
我的理解是不使用 dummy.next = list1 而只是让 dummy = list1,我们实际上是在重写 dummy 的当前值。然后当我们到达:
dummy = dummy.next;
Dummy 将等于 null。因此,当我们进入循环的下一次迭代时,我们会将 null 重新分配给 list1 中的任何节点。那么,当我们这样做时,为什么 head 无法跟踪 dummy 呢?是因为我们将 dummy 的第一个节点分配给不同的列表吗?
您只能通过为节点的属性赋值来改变列表,而不是通过为局部变量赋值。
就像 list1 = list1.next
不会 改变 list1
,而只是将引用移动到该列表中的下一个节点,所以 dummy = list1
也不会更改该列表。它只是设置一个节点的引用;该列表中没有任何变化。
所以在你的第二个版本中,dummy
开始作为对值为 -1 的节点的引用,但随后在循环的第一次迭代中 放弃 该节点,并引用 list1
中的另一个节点。因此,值为 -1 never 的节点将任何分配给它的 next
成员的东西都保留 null
直到函数执行结束。