單鏈表的逆序實現,遞迴和非遞迴演算法

2021-06-21 02:42:07 字數 984 閱讀 8130

這個也是很常見的面試題目。

剛開始見過,開了一下別人寫的以為理解了,讓我自己寫,我才發現原來裡面的細節是很多的,可以說,你也許大概懂演算法在幹什麼,可是,你若如果不注意細節,根本體會不到演算法裡面的每一行的意思,今天就是看了別人乙個演算法,被誤導了,怎麼都沒理解他的意思。結果看了10幾篇,果然他裡面漏了點東西,引導我越陷月深,所以,非要弄清楚,看了好多人寫的東西。

我只能說都大致相同,可是有很多細節都沒注意到,一看就是貼上過來的,裡面的沒思考。為了不誤導大家,這裡貼下兩種演算法。

非遞迴演算法,你只要理解整個過程怎麼乙個乙個斷開,乙個乙個鏈結起來的,就還演算法容易理解

而遞迴演算法,我只能說,你不畫乙個遞迴樹圖,你根本反應不過來在幹什麼,我也是看了很多人寫的,內容,**分析才明白的。如下:

class test4

node reverse(node head)

return p2;

} node reversewithrecursive(node head)

}

簡單補充幾句,非遞迴

p1記錄當前節點的前乙個節點上是什麼?

p2就是當前節點,最後乙個節點,也就是最後逆序以後的頭結點。

p3結點用來儲存p2結點的下乙個節點關係的中間變數。

大概過程就是,斷開後面的節點,連線到前面,直到最後乙個,他的最後為null,就返回了。

注意對於head頭結點的處理,直接讓他的next為null了,這裡最好有個圖,就更能很好的理解了。

遞迴對於遞迴真的比較巧妙了,遞迴的思想。

別問我啥是遞迴的思想

利用2個節點p,q(之前一直沒明白p是個什麼的?)

p其實記錄的就是第乙個節點的資訊,q則就是遞迴以後的最後乙個節點。

這裡要處理head結點,為什麼?自己思考

第乙個節點p要反鏈結到head頭結點上面

最後處理head結點為null

如果,你真的明白這個過程,那麼遞迴就理解的比較深入了。

單鏈表的遞迴與非遞迴實現

一 遞迴版本 1 class linklist 2 9 10 private linknode head 11 12 public void add int data 13 17 18 else 19 22 23 24 public void add linknode node,int data 2...

通過迭代(非遞迴)及遞迴將單鏈表逆序

通過迭代 非遞迴 及遞迴將單鏈表逆序 老生常談的問題了,不過很多地方面試還是很喜歡問這個問題。實際工程中感覺用處不大,需要逆序的儲存為什麼要選擇單鏈表呢?為什麼不用list in c 或iterator in any language 或者將資料全部推入棧中再依次彈出。說了這麼多有點無聊了,參看酷殼...

單鏈表反轉 非遞迴 遞迴方式實現

鍊錶的翻轉是程式設計師面試中出現頻度最高的問題之一,常見的解決方法分為遞迴和迭代兩種。最近在複習的時候,發現網上的資料都只告訴了怎麼做,但是根本沒有好好介紹兩種方法的實現過程與原理。所以我覺得有必要好好的整理一篇博文,來幫忙大家一步步理解其中的實現細節。我們知道迭代是從前往後依次處理,直到迴圈到鏈尾...