[英]Confusion about linked list traversal and debugging
我正在练习链表,但不确定这里出了什么问题。
在第一个实现中,我创建了一个 ListNode* 结果并给了它任何值,当我没有返回 dummyhead 时,我返回了 dummyhead->next ( resultHead->next
)。
这按预期工作。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
代码:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = new ListNode(0);
ListNode* resultHead = result;
int carry(0);
while(l1 || l2 || carry) {
int val1 = l1 ? l1->val : 0;
int val2 = l2 ? l2-> val : 0;
int sum(val1 + val2 + carry);
carry = sum/10;
ListNode* l3 = new ListNode(sum % 10);
result->next = l3;
result = result->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return resultHead->next;
}
现在我想也许我可以避免这种情况,如果我最初给它一个nullptr
检查 null 并将新节点分配给它,然后像以前一样继续,但在这种情况下,在调试器之后,列表开始丢失元素,当我这样做时result = result->next
。
代码:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = NULL; // also tried nullptr
ListNode* resultHead = result;
int carry(0);
while(l1 || l2 || carry) {
int val1 = l1 ? l1->val : 0;
int val2 = l2 ? l2-> val : 0;
int sum(val1 + val2 + carry);
carry = sum/10;
ListNode* l3 = new ListNode(sum % 10);
if(!result) result = l3;
else {
result->next = l3;
result = result->next;
}
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return resultHead;
}
我看到的一个问题是 resultHead 没有得到更新,我想这是需要处理的(更新 if 块中的条件)
,但为什么不能以这种方式正确地制作列表? 背后的原因是什么?
编辑:
Input lists
l1: [2,4,3]
l2: [5,6,4]
It assigns 7 to "result" in first pass
In second pass the list becomes [7,0] at the `result->next = l3` step in the else block but at the result = result->next the list becomes [0];
问题只是没有更新
resultHead
(我知道如何修复并且需要修复,但我认为我应该检查列表是否正常)而在链接列表之后它一次只指向一个元素,并且抛出我关闭(第一次调试链接列表),当时的值是 0 巧合地让我错误地认为列表为空,但事实并非如此。编辑:我的问题也不熟悉调试链表,它应该在我们前进时只显示前面的元素。
这基本上就是你的第一个代码所做的:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = new ListNode(0);
ListNode* resultHead = result;
while(l1 || l2 ) {
ListNode* l3 = new ListNode(0);
result->next = l3;
result = result->next;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return resultHead->next;
}
一开始有一个节点说 n0 ( result
和resultHead
指向它)。 并且在循环的每一轮中,您都会在结果后面添加一个新节点,因此 n0->n1,然后是 n0->n1->n2,等等。最后您将返回 n1,因此列表 n1->n2-> ...
在第二种情况下:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* result = NULL; // also tried nullptr
ListNode* resultHead = result;
while(l1 || l2 || carry) {
ListNode* l3 = new ListNode(0);
if(!result) result = l3;
else {
result->next = l3;
result = result->next;
}
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
}
return resultHead;
}
一开始你有result
并且resultHead
等于 null。 因此,无论循环中发生什么(对 resultHead 没有任何作用),您都只是返回 null 的resultHead
。 如果出现以下情况,您可以修改内部的正例:
if(!result) {
result = l3;
resultHead = result;
}
因此最后, resultHead
将等于第一个创建的节点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.