單向鍊錶反轉的方法有很多,其中用的比較多的是迭代法和遞迴法,迭代法通俗易懂,遞迴法相對來說比較難理解一些。
單向鍊錶反轉圖示:
一、迭代法
**實現:
import lombok.allargsconstructor;**解釋:import lombok.data;
@data
@allargsconstructor
public class listnode
return pre;
}public static void main(string args)
}
對於鍊錶中的乙個節點(cur)來說,它包含節點的值(value)、其所指向的下乙個節點(next)、及指向它的上乙個節點(pre)。反轉鍊錶就是要把當前節點指向的下乙個節點變成指向上乙個節點。(煉表頭沒有上乙個節點,鍊錶尾下乙個節點的指向為空)
next = cur.next; 保留當前節點的下乙個節點
pre = cur; 下次遍歷需要用到的上乙個節點
cur = next; 下次遍歷需要用到的當前節點
其執行過程可以用下圖表示:
二、遞迴法
遞迴法的解題思路是:利用遞迴的思想和棧先進後出的特性,完成鍊錶的反轉。
要理解遞迴法,首先要對遞迴和棧的特性有一定的了解,這裡簡單介紹一下。
遞迴:方法自己呼叫自己、遞迴需要有結束條件。
棧:先進後出。
要牢記這兩個點,對我們理解遞迴法很重要。
**實現:
import lombok.allargsconstructor;**解釋:import lombok.data;
@data
@allargsconstructor
public class listnode
listnode newhead = reverserecursion(head.next);
head.next.next = head;
head.next = null;
return newhead;
}public static void main(string args)
}
listnode newhead = reverserecursion(head.next);
1、遞迴法的目的是要返回乙個新的頭節點,這個新的頭節點是原來鍊錶的尾節點。
2、遞迴是方法自己呼叫自己,棧的特性是先進後出、後進先出。所以這段**的作用是不斷的去壓棧。
head.next.next = head; 把當前節點指向的下乙個節點的指向變為自己。(不要慌,這段**的解釋,下面有圖有真相)
head.next = null; 當前節點指向的下乙個節點變為空。
是不是看了上面的解釋還有點不理解,別急,我第一次看這段**的時候也是懵逼的(內心os:這寫了個啥,怎麼就反轉鍊錶了)
要理解這段**首先,我們得去壓幾個棧,可能你會說我腦子裡壓不了幾個棧容量就不夠了,腦子就亂了,stackoverflowexception。。。
講真,我最開始也是想放棄的,背住**算了。迭代法他就不香嗎。。。
後來想到人類對圖形的理解能力要長於文字,我們把這個過程畫出來試試看能否理解。
我們還使用上文中使用過的鍊錶作為資料來源來分析這個過程
listnode newhead = reverserecursion(head.next);這段**會執行四次,壓棧四次,如圖:
if (null == head || null == head.next) 這段**會讓 reverserecursion(head(4)) 發生彈棧,然而鍊錶沒有發生任何變化。。。方法繼續執行。
接著 reverserecursion(head(3)) 彈棧執行下面這段**
head.next.next = head;
head.next = null;
reverserecursion(head(3)) 執行之後鍊錶發生了如下變化:
下面的過程簡單了 reverserecursion(head(2))出棧。
reverserecursion(head(1))出棧:鍊錶反轉完成,撒花
子集 迭代法和遞迴法
給你乙個整數陣列nums,返回該陣列所有可能的子集 冪集 解集不能包含重複的子集。示例 1 輸入 nums 1,2,3 輸出 1 2 1,2 3 1,3 2,3 1,2,3 示例 2 輸入 nums 0 輸出 0 class solution ans.add new arraylist t retu...
快速冪 迭代法和遞迴法 python實現
迭代法 def quick power x,n res 1while n 0 如果冪為奇數,把x記錄下來,儲存在res中 if n 2 1 res x 如果冪為偶數 則不記錄,只是處理x,n x x n 1 return res遞迴法 def quick power x,n 特殊情況 if n 0 ...
陣列與鍊錶 一文讀懂
資料結構是軟體開發中最基礎的部分了,它體現著我們程式設計的內功。大多數人在正兒八經學習資料結構的時候估計是在大學計算機課上,而在實際專案開發中,反而感覺到用得不多。其實也不是真的用得少,只不過我們在使用的時候被很多高階語言和框架元件封裝好了,真正需要自己去實現的地方比較少而已。但別人封裝好了不代表我...