用遞迴反轉單鏈表

2021-10-06 02:57:12 字數 955 閱讀 7498

首先考慮遞迴的邊界條件,什麼情況下不用反轉
當只有乙個結點的時候

從前往後走,到只剩最後乙個結點時返回該結點,作為新鍊錶的頭結點

所以**應該是是這樣的

public

static

void

reverse

(node head)

那麼接下來就應該找遞推公式了

遞推公式怎麼求呢

比方說 h1.next=h2 h2.next=null;

也就是說h1指向h2,而h2指向null,那麼我們怎麼反轉它呢

應該是 h2.next=h1 h1.next=null

而h2=h1.next 就可以寫成 h1.next.next=h1;h1.next=null;

那麼我們的遞推公式就求出來了

**就應該是

public

static

void

reverse

(node head)

剛開始一直有疑問,就是當第一次從遞迴出來時,head不是應該指向最後乙個結點嗎,那遞推公式怎麼求,在這塊想半天,然後又自己debug,才終於明白。

首先邊界條件就是return最後乙個結點,那麼head等於什麼時return的最後乙個結點呢?

假如現在就是那個第一次返回的head1,在這個head1上呼叫reverse(head1.next),然後head1.next被當作引數傳進去了。

為了方便理解我們讓head2=head1.next

首先判斷head2.next==null,發現正確return head2;,這時head1.next.next=head1; head1.next=null;

也可以理解為head2.next=head1,head1.next=null;

然後就都一樣了

理解遞迴反轉單鏈表

n個月前我玩過一次反轉鍊錶,大概有兩種方法,一種是while迴圈遍歷,另外一種是遞迴,今天帶大家理解一下遞迴的實現邏輯 遞迴實現反轉鍊錶,其實就是系統幫我們壓棧的過程每遞迴一次,指向不同的下乙個節點 大致的流程就是上圖所示 下面來理解上圖這個邏輯 話不多說上 class listnode overr...

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

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

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

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