簡體   English   中英

這種遞歸和回溯在 LeetCode 中是如何工作的?

[英]How does this recursion and back tracking work in LeetCode?

這個 function 將反向打印鏈表的節點:

void recur(ListNode head) {
    if(head == null) return; 
    recur(head.next);
    tmp.add(head.val);
}

如果列表是1 -> 2 -> 3tmp (一個ArrayList )將添加節點的值。

最后,我們可以通過打印tmp得到一個列表[3, 2, 1] 但是,我不知道它為什么起作用。 為什么遞歸recur循環到最后一個節點然后以相反的順序添加值?

我認為這個流程圖可以幫助你。

在此處輸入圖像描述

從圖中可以看出,僅當到達鏈表的末尾時,head.value 才會添加到 tmp 列表中。 即頭部變成null

這非常簡單,讓我們考慮具有兩個 ListNode 的[1 -> 2]節點,我們想與您反轉 function:

void recur(ListNode head) {
    if (head == null) return;
    recur(head.next);
    tmp.add(head.val);
}
  1. 在第一個詞干上,head 將指向1值,此檢查if (head == null)將返回false ,因為 head 節點不是 null。
  2. 然后我們調用相同的 function recur但對於值為2的下一個節點,並且recur的執行重新開始,但節點2作為頭節點。 我們再次檢查if (head == null) -> false ,同樣的原因,這里的 head 不是 null。
  3. 然后我們調用相同的 function recur但對於下一個節點 null head.next -> null ,因為在節點2之后不再有節點。 我們檢查if (head == null) ,但現在我們有了true ,即當前節點,這意味着之后沒有節點,我們不能 go 進一步調用recur() 因此,我們使用return語句停止遞歸。
  4. 現在,我們再次返回到第 2 步並繼續執行,因為recur(head.next)的執行以return語句結束。 這意味着,這個節點是最后一個,我們把它的值放到tmp中。 並且 ListNode 2recur執行結束,因為后面沒有代碼行。
  5. 現在,我們再次返回到第 1 步並執行與第 4 步中描述的相同的邏輯。由於節點2recur結束了它的執行,我們繼續並將值1放入tmp數組。

if (head == null) return; - 這個檢查,稱為遞歸base case ,意味着when we need to end execution and exit? ,沒有它遞歸將無限次 go。

我們挖掘到 ListNode 的末尾,然后再次返回頂部。 為了能夠將 ListNode 值放入tmp ,我們首先需要將下一個值放入tmp ,依此類推。

我希望,我現在解釋得更准確,更清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM