C/C++ 雙鏈表之逆序的實例詳解
C/C++ 雙鏈表之逆序的實例詳解
一、結點結構
雙向鏈表的數(shù)據(jù)結構定義如下:
typedef struct node
{
ElemType data;
struct node *prior
struct node *next;
}list;
其中,ElemType可以是任意數(shù)據(jù)類型如int、float或者char等,在算法中,規(guī)定其默認為int類型。
二、帶頭結點
本文描述的是雙向鏈表逆序,鏈表逆序需要維護3個指針,分別指向前一個節(jié)點、當前節(jié)點和下一個節(jié)點,具體代碼如下:
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;
}
不帶頭結點的鏈表逆序與帶頭結點的區(qū)別在于紅色部分代碼,即初始p1指向的是第一個結點而不是頭結點,最后head直接指向p1而不是用其next來指向p1。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關文章
c++網(wǎng)絡編程下Linux的epoll技術和Windows下的IOCP模型
c++ 網(wǎng)絡編程LINUX-epoll/windows-IOCP下socket opoll函數(shù)用法 優(yōu)于select方法的epoll 以及windows下IOCP 解決多進程服務端創(chuàng)建進程資源浪費問題,感興趣的小伙伴一起來學習吧2021-08-08
QT?UDP網(wǎng)絡編程實現(xiàn)簡單消息傳輸
這篇文章主要為大家詳細介紹了QT?UDP網(wǎng)絡編程實現(xiàn)簡單消息傳輸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-08-08

