[英]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 -> 3則tmp
(一個ArrayList
)將添加節點的值。
最后,我們可以通過打印tmp
得到一個列表[3, 2, 1]
。 但是,我不知道它為什么起作用。 為什么遞歸recur
循環到最后一個節點然后以相反的順序添加值?
這非常簡單,讓我們考慮具有兩個 ListNode 的[1 -> 2]
節點,我們想與您反轉 function:
void recur(ListNode head) {
if (head == null) return;
recur(head.next);
tmp.add(head.val);
}
1
值,此檢查if (head == null)
將返回false
,因為 head 節點不是 null。recur
但對於值為2
的下一個節點,並且recur
的執行重新開始,但節點2
作為頭節點。 我們再次檢查if (head == null)
-> false
,同樣的原因,這里的 head 不是 null。recur
但對於下一個節點 null head.next -> null
,因為在節點2
之后不再有節點。 我們檢查if (head == null)
,但現在我們有了true
,即當前節點,這意味着之后沒有節點,我們不能 go 進一步調用recur()
。 因此,我們使用return
語句停止遞歸。recur(head.next)
的執行以return
語句結束。 這意味着,這個節點是最后一個,我們把它的值放到tmp
中。 並且 ListNode 2
的recur
執行結束,因為后面沒有代碼行。2
的recur
結束了它的執行,我們繼續並將值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.