二 單鏈表的反轉 遞迴和迴圈方式實現

2021-08-29 13:57:21 字數 1604 閱讀 7478

單鏈表的建立、列印和釋放見部落格 一:單鏈表的建立、列印和釋放

1. 遞迴方式實現單鏈表的反轉

/**

*@param plist node_t * :帶頭結點的單鏈表的第乙個有效結點

*/node_t * slistrecur(node_t *pfirst)

node_t *pnewnode = slistrecur(pfirst->pnext);

pfirst->pnext->pnext = pfirst;

pfirst->pnext = null;

return pnewnode;

}/**

* 通過遞迴方式實現單鏈表的反轉

* 原來的單鏈表成為反轉後的單鏈表

* */

node_t * reverseslistrecur(node_t *plist)

node_t *phead = plist;

node_t *pnewhead = slistrecur(phead->pnext);

phead->pnext = pnewhead;

return phead;

}

2. 迴圈方式實現單鏈表的反轉

​​/**

* 通過迴圈方式實現單鏈表的反轉

* 原來的單鏈表成為反轉後的單鏈表

* * @param plist node_t * :單鏈表的頭結點

*/node_t * reverseslistcirle(node_t *plist)

node_t *phead = plist;

node_t *ppre = phead->pnext;

node_t *pcur = ppre->pnext;

node_t *pnext = null;

/* 第乙個有效結點的後繼不設定為空,會造成無限迴圈 */

ppre->pnext = null;

/* 使用三個指標指示當前,前乙個,後乙個結點位址

每次使當前、前乙個結點反轉,然後指標後移 */

while (pcur != null)

phead->pnext = ppre;

return phead;

}

3. 測試**

int main() ;

node_t *plist1 = createarrayslist(aarray, 6);

showslist(plist1);

node_t *pnew1 = reverseslistrecur(plist1);

showslist(pnew1);

freeslist(plist1);

/* 建立單鏈表,迴圈遍歷單鏈表 */

node_t *plist2 = createarrayslist(aarray, 6);

showslist(plist2);

node_t *pnew2 = reverseslistcirle(plist2);

showslist(pnew2);

freeslist(plist2);

return 0;

}

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

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

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

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

單鏈表,以及反轉遞迴實現,

author by zhouwx5 created on by 2019 11 19 desc public class linkednode private void linklist t element private int length 獲取給定索引的值 param index 給定索引 r...