2013-03-15 120 views
1

對不起,如果這是一個非常基本的問題,我只是想學習遞歸。反向鏈表 - 遞歸

以下代碼可以反轉鏈接列表。

我理解直到第3行的邏輯,但是我很困惑第4行將被稱爲(n.next=prev),因爲在執行該行之前再次調用該函數。

有人可以讓我知道這種遞歸的流程嗎?

void reverse(node n, node prev) { 
    if (n == null) { newroot = prev; return; } 
    reverse(n.next, n); 
    n.next = prev; 
    } 
+0

代碼來自哪裏,出於興趣?我看不到第4行會如何運行。第2行是基本情況,它返回一些東西,所以第3行將一直阻塞,直到它返回一些東西。是否有一些線程正在進行,這並不明顯? – 2013-03-15 15:36:15

+0

該代碼來自http://www.careercup.com/question?id=7787672 – Learner 2013-03-15 15:37:30

+0

謝謝,但我仍然不確定。 +1的問題。 – 2013-03-15 15:40:11

回答

2

只要ñ命中null和反向功能return會原路返回從有到它的調用函數,它的第一個函數調用一路。

更新:有關更完整的說明,請參閱下面的註釋。

+0

第4行運行的是什麼點? – 2013-03-15 15:37:34

+0

對不起,錯過了,忙於解釋遞歸的流程。正如我已經知道的那樣,因爲沒有返回語句,函數會在執行(反向)'reverse(n.next,n)'後執行'n.next = prev;';'將控制權釋放給調用函數。 – 2013-03-15 15:51:23

+0

當我讀到它時,每當第三行調用'reverse'時,它都會阻塞,直到其中一個遞歸調用通過一個等於'null'的'n'。最後一個函數調用不會返回任何〜大概是'null'值,我不知道這是什麼語言。這退回到'reverse'的第一個實例,它仍然停留在第3行,現在進行評估,不返回任何內容,從不允許第4行執行。我認爲這就是我和Learner都看到的。我不明白第4行是如何執行的? – 2013-03-15 16:01:20