簡體   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