一文讀懂鍊錶反轉(迭代法和遞迴法)

2022-06-10 07:30:12 字數 3016 閱讀 4632

單向鍊錶反轉的方法有很多,其中用的比較多的是迭代法和遞迴法,迭代法通俗易懂,遞迴法相對來說比較難理解一些。

單向鍊錶反轉圖示:

一、迭代法

**實現:

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 ...

陣列與鍊錶 一文讀懂

資料結構是軟體開發中最基礎的部分了,它體現著我們程式設計的內功。大多數人在正兒八經學習資料結構的時候估計是在大學計算機課上,而在實際專案開發中,反而感覺到用得不多。其實也不是真的用得少,只不過我們在使用的時候被很多高階語言和框架元件封裝好了,真正需要自己去實現的地方比較少而已。但別人封裝好了不代表我...