C/C++ 雙鏈表之逆序的實例詳解
創新互聯公司公司2013年成立,是專業互聯網技術服務公司,擁有項目成都網站設計、成都做網站網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元福山做網站,已為上家服務,為福山各地企業和個人服務,聯系電話:18980820575
一、結點結構
雙向鏈表的數據結構定義如下:
typedef struct node { ElemType data; struct node *prior struct node *next; }list;
其中,ElemType可以是任意數據類型如int、float或者char等,在算法中,規定其默認為int類型。
二、帶頭結點
本文描述的是雙向鏈表逆序,鏈表逆序需要維護3個指針,分別指向前一個節點、當前節點和下一個節點,具體代碼如下:
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; // 保存當前結點的下一結點 p2->next = p1; // 改變當前結點的next域,指向它的前一個結點 p1->prior = p2; // 改變前一個結點的prior域,指向它的后一個結點 p1 = p2; // 指針移到下一個結點 p2 = p3; } head->next = p1; // 恢復頭結點 p1->prior = head; return head; }
在鏈表逆序過程中,非常重要的一點是要防止斷鏈問題,因此,在移動指針逆序某個結點時,需要用一個指針指向該結點的下一結點,防止下一結點丟失。
三、不帶頭結點
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; }
不帶頭結點的鏈表逆序與帶頭結點的區別在于紅色部分代碼,即初始p1指向的是第一個結點而不是頭結點,最后head直接指向p1而不是用其next來指向p1。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
分享題目:C/C++雙鏈表之逆序的實例詳解
當前鏈接:http://m.newbst.com/article14/jesjde.html
成都網站建設公司_創新互聯,為您提供網站改版、靜態網站、商城網站、品牌網站制作、網站制作、App開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯