C++帶頭雙向循環(huán)鏈表超詳細(xì)解析
上期我們講完了無頭單向非循環(huán)鏈表,這期我們接著來講鏈表中結(jié)構(gòu)最復(fù)雜的帶頭雙向循環(huán)鏈表!
本期主要內(nèi)容:
?? 什么是帶頭雙向循環(huán)鏈表?
?? 帶頭雙向循環(huán)鏈表常用接口實現(xiàn)!
?? 順序表和鏈表的區(qū)別和聯(lián)系!
什么是帶頭雙向循環(huán)鏈表
什么是帶頭?雙向?循環(huán)?(帶頭雙向循環(huán)鏈表)
帶頭:代表鏈表存在一個哨兵位節(jié)點,也就是頭節(jié)點,這個節(jié)點不存放任何的有效數(shù)據(jù)!
雙向:每個節(jié)點都有兩個指針,分別指向它的前一個節(jié)點和后一個節(jié)點!
循環(huán):最后一個節(jié)點next不再指向NULL指向的是哨兵位節(jié)點,哨兵位節(jié)點prev指向的是最后一個節(jié)點!(如果是單項鏈表的話哨兵位不指向最后一個節(jié)點!)
帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨存儲數(shù)據(jù)。實際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實現(xiàn)以后會發(fā)現(xiàn)結(jié)構(gòu)會帶來很多優(yōu)勢,實現(xiàn)反而簡單了,后面我們代碼實現(xiàn)了就知道了!
帶頭雙向循環(huán)鏈表常用接口實現(xiàn)
?? 搭建帶頭雙向循環(huán)鏈表的結(jié)構(gòu)!
?? 帶頭雙向循環(huán)鏈表的初始化并創(chuàng)建新節(jié)點!
?? 頭部插入節(jié)點!
?? 尾部插入節(jié)點!
?? 頭部刪除節(jié)點!
?? 尾部刪除節(jié)點!
?? 在pos節(jié)點前插入節(jié)點!
我們首先要找到pos節(jié)點的地址!
ListNode* ListFind(ListNode* phead, LTDataType x) { assert(phead); ListNode* cur = phead->next; while (cur != phead) { if (cur->data == x) { return cur; } cur = cur->next; } return NULL; }
?? 刪除指定pos節(jié)點!
看了上面的那么多的圖解,相信刪除指定節(jié)點對你來說也很簡單吧!我就直接上代碼了!
void ListErase(ListNode* pos) { assert(pos); ListNode* prev = pos->prev; ListNode* next = pos->next; prev->next = next; next->prev = prev; free(pos); pos = NULL; }
?? 最后別忘記銷毀鏈表哦!
void ListDestory(ListNode* phead) { ListNode* cur = phead->next; while (cur != phead) { ListNode* next = cur->next; free(cur); cur = next; } free(phead); phead = NULL; }
其實很多小伙伴一看到數(shù)據(jù)結(jié)構(gòu)就頭疼,但是我想說,不要嫌畫圖麻煩,一定要多畫圖,這樣更有利于我們實現(xiàn)代碼,靠腦袋空想是想不出來的!
最后愛打籃球的程序猿想送小伙伴們一句話:天再高又怎樣,踮起腳尖就更接近陽光!
gitee(碼云):Mercury. (zzwlwp) - Gitee.com
到此這篇關(guān)于C++帶頭雙向循環(huán)鏈表超詳細(xì)解析的文章就介紹到這了,更多相關(guān)C++ 帶頭雙向循環(huán)鏈表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解
這篇文章主要介紹了VSCode 搭建 Arm 遠(yuǎn)程調(diào)試環(huán)境的步驟詳解,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04