此處明確了實現的方法,另外非遞迴(迭代)的方法也可行。
首先我們需要知道一些基礎知識--即遞迴的相關概念。遞迴(recursion)即函式自己呼叫自己,若問題可以使用遞迴來解決,則必須滿足以下三個條件:
1.可以要把解決的乙個問題轉化為乙個新的問題,這個新問題的解決思路與原來相同,只是在有規律的變化(例如遞增遞減).
說明:遞迴可以解決的方法,非遞迴一定也可以.
2.可以應用這個轉化過程使問題得到解決。
說明:使用其他方法(非遞迴的)一定存在同樣可以解決問題的方法,但效率可能不如遞迴
3.必須要有乙個明確的結束遞迴的條件。
說明:該條件是我們一開始就知道或者說設定好的,作為過程的出口。
遞迴的核心:逐級呼叫,逐級返回
說明:1.當函式自己呼叫自己時,系統將自動把函式當前的變數和形參暫時保留起來,在新一輪的呼叫過程中,系統為新呼叫的函式所用到的變數和形參開闢另外的儲存單元(即記憶體空間),每次呼叫函式所使用的變數在不同的記憶體空間中。
2.遞迴呼叫的層次越多,同名變數(因為就是函式自身)占用的儲存單元也就越多。每次函式的呼叫,系統都會為該函式的變數開闢新的記憶體空間。
3.當本次呼叫的函式執行結束時,系統將釋放本次呼叫時所占用的記憶體空間。程式的流程返回到上一層的呼叫點,同時期的當初進入該層時,函式的變數和形參所占用的記憶體空間的資料(這點很重要,它使我們的結果在不斷的變化中,直到遇到出口)
下面是關於鍊錶反轉實現的思路
與迭代不同的是,遞迴是從後向前,即從尾節點向頭節點逐個翻轉來實現效果的。
首先我們假定建立了乙個共有5個節點的鍊錶,像下邊這樣:
之後我們建立乙個新的變數newh,並同時移動h直到它們指向尾節點,此時newh作為新的頭節點,其指向固定在此位置
然後h指標逐層返回的時候做下圖的處理,將h的指向的位址賦值給h->next->next指標,並一定注意要讓h->next=null
說明:此處為操作的核心,實現了斷鏈和反轉其指向的功能。由遞迴的相關概念我們可以知道,逐級返回的一開始,head就指向前乙個節點了(即'4'這個節點),而head->next->next與head的基準是不一樣的!前乙個在此時指的是'5'這個節點,因此其next的next,即null的next,本來是指向未開闢的(無法輸出)記憶體,但此時我們將它改為指向前乙個節點,實現了反轉的效果,並在此操作後將'4'這個節點斷開(即指向null)
繼續上述操作:
直到返回到頭:
部分**如下:
listnode* reverse(listnode* h)
鍊錶的建立 輸出 非遞迴反轉 遞迴反轉
鍊錶的建立 輸出 非遞迴反轉 遞迴反轉 如下 include include include include include include include include include include include include using namespace std const int m...
python實現鍊錶的反轉遞迴 用遞迴法反轉單鏈表
鍊錶是一種遞迴結構,因此將其與函式式一起使用將產生最佳結果。在您的程式中,您已經使用過程樣式和mutable節點實現了乙個鏈結列表,您將隨著時間的推移更改data和 的值。雖然這可能感覺像是一種直觀的方法,但我想重點關注一種不可變的規則,它將我們從嚴重的狀態複雜性中解放出來。在 首先,我們修復了no...
日拱一卒 鍊錶 鍊錶反轉(遞迴解法)
上篇我們主要介紹鍊錶反轉的原地反轉解法。除此以外,是否還有其他解法?當然,今天就來看看鍊錶反轉的遞迴解法。遞迴,字面意思,有 遞 也有 歸 拿我們經常聽到的斐波那契數列來說,公式如下 f n f n 1 f n 2 f 1 1,f 2 1 現在比如求解f 5 的值,按照公式,可以展開為f 5 f 4...