經典演算法 單鏈表反轉的遞迴方法和非遞迴方法

2021-07-11 01:45:19 字數 1154 閱讀 2183

單鏈表反轉有遞迴和非遞迴兩種實現方法,

首先定義鍊錶結點:

//定義乙個鍊錶節點

struct listnode

;

一、遞迴方法先反轉後面的鍊錶,從最後面的兩個結點開始反轉,依次向前,將後乙個鍊錶結點指向前乙個結點,注意每次反轉後要將原煉表中前乙個結點的指標域置空,表示將原煉表中前乙個結點指向後乙個結點的指向關係斷開。

二、非遞迴方法

利用兩個結點指標和乙個中間結點指標temp(用來記錄當前結點的下乙個節點的位置),分別指向當前結點和前乙個結點,每次迴圈讓當前結點的指標域指向前乙個結點即可,翻轉結束後,記得將最後乙個節點的鏈域置為空。

整體測試程式:

#includeusing namespace std;

//定義乙個鍊錶節點

struct listnode

;//插入乙個新節點到鍊錶中(放在鍊錶頭部)

void createlist(listnode * & head, int data)

p->next = head;

head = p;

}void printlist(listnode* head)

cout << endl;

}//遞迴方式:實現單鏈表反轉

listnode * reverselist(listnode * head)

}//非遞迴方式:實現單鏈表反轉

listnode* reverselist2(listnode* head)

head->next = null; //while結束後,將翻轉後的最後乙個節點(即翻轉前的第乙個結點head)的鏈域置為null

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

定義單鏈表的結點 typedef struct listnodelistnode 我們採用的單鏈表是帶頭結點的。需要遍歷一遍鍊錶,在遍歷過程中,把遍歷的節點一次插入到頭部。在這個過程之後,第乙個節點成了最後節點,因此要特殊處理,改其後繼為null。void inversion listnode he...

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

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

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

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