C/C++ 雙鏈表之逆序的實(shí)例詳解
C/C++ 雙鏈表之逆序的實(shí)例詳解
一、結(jié)點(diǎn)結(jié)構(gòu)
雙向鏈表的數(shù)據(jù)結(jié)構(gòu)定義如下:
typedef struct node { ElemType data; struct node *prior struct node *next; }list;
其中,ElemType可以是任意數(shù)據(jù)類型如int、float或者char等,在算法中,規(guī)定其默認(rèn)為int類型。
二、帶頭結(jié)點(diǎn)
本文描述的是雙向鏈表逆序,鏈表逆序需要維護(hù)3個指針,分別指向前一個節(jié)點(diǎn)、當(dāng)前節(jié)點(diǎn)和下一個節(jié)點(diǎn),具體代碼如下:
list *reverselist(list *head) { if ((NULL == head) || (NULL == head->next)) { return head; } list *p1=head->next, *p2=p1->next, *p3=NULL; p1->next = NULL; while (p2) { p3 = p2->next; // 保存當(dāng)前結(jié)點(diǎn)的下一結(jié)點(diǎn) p2->next = p1; // 改變當(dāng)前結(jié)點(diǎn)的next域,指向它的前一個結(jié)點(diǎn) p1->prior = p2; // 改變前一個結(jié)點(diǎn)的prior域,指向它的后一個結(jié)點(diǎn) p1 = p2; // 指針移到下一個結(jié)點(diǎn) p2 = p3; } head->next = p1; // 恢復(fù)頭結(jié)點(diǎn) p1->prior = head; return head; }
在鏈表逆序過程中,非常重要的一點(diǎn)是要防止斷鏈問題,因此,在移動指針逆序某個結(jié)點(diǎn)時,需要用一個指針指向該結(jié)點(diǎn)的下一結(jié)點(diǎn),防止下一結(jié)點(diǎn)丟失。
三、不帶頭結(jié)點(diǎn)
list *reverselist(list *head) { if ((NULL == head) || (NULL == head->next)) { return head; } list *p1=head, *p2=p1->next, *p3=NULL; p1->next = NULL; while (p2) { p3 = p2->next; p2->next = p1; p1->prior = p2; p1 = p2; p2 = p3; } head = p1; return head; }
不帶頭結(jié)點(diǎn)的鏈表逆序與帶頭結(jié)點(diǎn)的區(qū)別在于紅色部分代碼,即初始p1指向的是第一個結(jié)點(diǎn)而不是頭結(jié)點(diǎn),最后head直接指向p1而不是用其next來指向p1。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- 使用C++實(shí)現(xiàn)順序鏈表
- C++數(shù)據(jù)結(jié)構(gòu)之鏈表的創(chuàng)建
- C++數(shù)據(jù)結(jié)構(gòu)與算法之反轉(zhuǎn)鏈表的方法詳解
- C++ STL入門教程(2) list雙向鏈表使用方法(附程序代碼)
- 利用C++簡單實(shí)現(xiàn)順序表和單鏈表的示例代碼
- C++ 實(shí)現(xiàn)雙向鏈表的實(shí)例
- C++中鏈表操作實(shí)例分析
- C++ 實(shí)現(xiàn)靜態(tài)鏈表的簡單實(shí)例
- C++刪除鏈表中間節(jié)點(diǎn)的方法
- 數(shù)據(jù)結(jié)構(gòu)與算法:單向鏈表實(shí)現(xiàn)與封裝
相關(guān)文章
C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法
最近筆試經(jīng)常遇到需要對字符串進(jìn)行快速分割的情景,下面這篇文章主要給大家介紹了關(guān)于C++中string字符串分割函數(shù)split()的4種實(shí)現(xiàn)方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06C語言實(shí)現(xiàn)二值圖像模擬灰值圖像顯示效果
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)二值圖像模擬灰值圖像顯示效果,分為圖案法、抖動法兩個方法實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10