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

2021-06-29 09:21:15 字數 1055 閱讀 2252

單鏈表反轉有遞迴和非遞迴兩種演算法。

下面定義節點

[cpp]view plain

copy

typedef

struct listnodelistnode;  

在遞迴演算法中的做法是:

1找到最後乙個節點和倒數第二個節點,把最後乙個節點設為頭節點的後繼

2反轉這兩個節點

3倒數第三個和第四個節點重複執行步驟2

其中注意,鍊錶是以節點後繼為null結束的,在更改指標的過程中要把改後的節點後繼改為null

**如下:

[cpp]view plain

copy

void inversion_recursion(listnode* p,listnode* head)  

inversion_recursion(p->next,head);  

p->next->next=p;//反轉節點

p->next=null;//第乙個節點反轉後其後繼應該為null

}  

非遞迴實現很簡單,只需要遍歷一遍鍊錶,在遍歷過程中,把遍歷的節點一次插入到頭部。在這個過程之後,第乙個節點成了最後節點,因此要特殊處理,改其後繼為null

[cpp]view plain

copy

void inversion(listnode* head)  

while(current!=null)  

}  測試**:

[cpp]view plain

copy

#include

#include

typedef

struct listnodelistnode;  

int main()  

inversion_recursion(head->next,head);  

inversion(head);  

tmp=head->next;  

while(1)  

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

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

單鏈表反轉遞迴與非遞迴演算法

1.如下 1 include 2 include 3 4using namespace std 56 struct node 715 16 17 node createlist int elem,int length 1825 return p 26 27 28void destroylist no...

面試題 單鏈表反轉 遞迴和非遞迴

include include typedef struct node node,linklist 一般反轉 linklist reverse linklist head node pre,cur,next pre head cur head next while cur head next nul...