理解遞迴反轉單鏈表

2021-09-26 20:39:41 字數 1814 閱讀 4845

n個月前我玩過一次反轉鍊錶,大概有兩種方法,一種是while迴圈遍歷,另外一種是遞迴,今天帶大家理解一下遞迴的實現邏輯

遞迴實現反轉鍊錶,其實就是系統幫我們壓棧的過程每遞迴一次,指向不同的下乙個節點

大致的流程就是上圖所示 , 下面來理解上圖這個邏輯

話不多說上**

class listnode 

@override

public string tostring()

}public class linkedlist

public static listnode reverse(listnode head)

listnode temp = head.next;

listnode newhead = reverse(head.next);

system.out.println("head ===> " + head);

system.out.println("temp ===> " + temp);

system.out.println("new head before **********==> " + newhead);

temp.next = head;

head.next = null;

system.out.println("new head after **********==> " + newhead);

return newhead;}}

下面是控制台的輸出

1 - > 2 - > 3 - > 4 - > null

head ===> 3 - > 4 - > null

temp ===> 4 - > null

new head before **********==> 4 - > null

new head after **********==> 4 - > 3 - > null

head ===> 2 - > 3 - > null

temp ===> 3 - > null

new head before **********==> 4 - > 3 - > null

new head after **********==> 4 - > 3 - > 2 - > null

head ===> 1 - > 2 - > null

temp ===> 2 - > null

new head before **********==> 4 - > 3 - > 2 - > null

new head after **********==> 4 - > 3 - > 2 - > 1 - > null

4 - > 3 - > 2 - > 1 - > null

在**中 temp=head.next 並且

看到控制台的輸出不難發現,遞迴的層級關係,下層只是上層的 next 而已

他們倆相差的值正是我需要的,這時候只要把 temp.next = head 的指向變一下

就是最後的值在前面,之前的值在後面,他們的位置交換一下,

再把 head.next = null; 指向為null,不然就巢狀引用了,以此類推,沒當一次遞迴結束後,

就會把前乙個值變成後乙個的子節點,這就完成了反轉鍊錶的操作

是不是so easy呢??

用遞迴反轉單鏈表

首先考慮遞迴的邊界條件,什麼情況下不用反轉當只有乙個結點的時候 從前往後走,到只剩最後乙個結點時返回該結點,作為新鍊錶的頭結點 所以 應該是是這樣的 public static void reverse node head 那麼接下來就應該找遞推公式了 遞推公式怎麼求呢 比方說 h1.next h2...

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 cpp view plain copy typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟...

單鏈表反轉(遞迴和非遞迴)

單鏈表反轉有遞迴和非遞迴兩種演算法。下面定義節點 typedef struct listnodelistnode 在遞迴演算法中的做法是 1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼 2反轉這兩個節點 3倒數第三個和第四個節點重複執行步驟2 其中注意,鍊錶是以節點後繼為null...