[英]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.