关于链表遍历和调试的困惑
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;
}
我看到的一个问题是结果头没有得到更新,这 我猜是要处理的事情(更新 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
(我知道如何修复并且需要修复,但我认为我应该检查列表是否正常(同时遵循 linkedlist 它一次只指向一个元素,这让我很震惊 关闭(第一次调试链表(,此时的值为 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
等于空。因此,无论循环中发生什么(它对resultHead没有任何作用(,你只是返回resultHead
这是空的。如果出现以下情况,您可以修改内部的阳性情况:
if(!result) {
result = l3;
resultHead = result;
}
因此,在最后,resultHead
将等于第一个创建的节点。
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 如何在可变参数模板函数中遍历可变参数元组?
- 避免在遍历 IShellItemArray 时出现代码重复
- 从特定键开始遍历地图
- 关于链表遍历和调试的困惑
- 将树节点添加到向量向量中的 n 元树遍历的平均和最坏情况时间复杂度是多少?
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- c++GetSystemTime在调试时返回0,但在遍历断点时返回正确的输出