繁体   English   中英

关于链表遍历和调试的困惑

[英]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 ( resultresultHead指向它)。 并且在循环的每一轮中,您都会在结果后面添加一个新节点,因此 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM