f****e 发帖数: 923 | 1 刚刚学习链表, 请问 head = dummy 是把dummy的值赋给 head吗? 还是其他含义?
为什么最后返回dummy.next 就是返回合并之后的整个链表?貌似 循环过程没dummy 啥
事?
private ListNode merge(ListNode head1, ListNode head2) {
ListNode dummy = new ListNode(-1);
ListNode head = dummy;
while (head1 != null && head2 != null ) {
if (head1.val < head2.val) {
head.next = head1;
head1 = head1.next;
}else {
head.next = head2;
head2 = head2.next;
}
head = head.next;
}
if (head1 != null) {
head.next = head1;
}
else {
head.next = head2;
}
return dummy.next;
}
public class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
} |
v*****y 发帖数: 68 | 2 dummy head的存在是为了避免处理head == null的情况,它就像一个假head,而真head
是dummy.next |
f****e 发帖数: 923 | 3 谢谢解答,请问 head = dummy 是把dummy的值赋给 head吗? 还是其他含义?
为什么运行完 循环之后,没有把 head 重新赋给dummy 然后返回,
dummy 和head 是什么关系,就这一点不太明白,请帮忙,谢谢
head
【在 v*****y 的大作中提到】 : dummy head的存在是为了避免处理head == null的情况,它就像一个假head,而真head : 是dummy.next
|
k****i 发帖数: 128 | 4 还是c++好,直接local reference |
f**********r 发帖数: 2137 | 5 head实际上不是head,每加一个都往后走, head = head.next;
dummy.next才是真正的head
【在 f****e 的大作中提到】 : 谢谢解答,请问 head = dummy 是把dummy的值赋给 head吗? 还是其他含义? : 为什么运行完 循环之后,没有把 head 重新赋给dummy 然后返回, : dummy 和head 是什么关系,就这一点不太明白,请帮忙,谢谢 : : head
|
A*******e 发帖数: 2419 | 6 为何要避免处理?这个和C++很不一样啊。
head
【在 v*****y 的大作中提到】 : dummy head的存在是为了避免处理head == null的情况,它就像一个假head,而真head : 是dummy.next
|
v*****y 发帖数: 68 | 7 就这个例子而言,我们最终返回的那个head刚开始还未确定,他可能是head1或head2中
的一个,因此我们先假设有了head,遇到真head之后直接像处理普通node一样加在后面
就可以了。这样有一个很大的好处是clean code。
【在 f****e 的大作中提到】 : 谢谢解答,请问 head = dummy 是把dummy的值赋给 head吗? 还是其他含义? : 为什么运行完 循环之后,没有把 head 重新赋给dummy 然后返回, : dummy 和head 是什么关系,就这一点不太明白,请帮忙,谢谢 : : head
|
b********a 发帖数: 70 | |
l*****o 发帖数: 7 | 9 Dummy pointer就是你new出来的一个新node,他的next是链表的头节点。
因为如果你对链表的头指针进行操作,需要单独的判断。比如删除,链表里其他节点,
直接让它的前驱连上后继就行,但是头节点因为没有前驱所以得单独判断。如果加上
dummy就不存在这个问题了,让相同的逻辑能处理所有节点,使代码简洁高效而且不容
易出bug。 |