【数据结构与算法】之链表的操作和使用
生活随笔
收集整理的這篇文章主要介紹了
【数据结构与算法】之链表的操作和使用
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鏈表的定義
- 鏈表:由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。
- 鏈表這種存儲(chǔ)方式,其元素個(gè)數(shù)是不受限定的,當(dāng)進(jìn)行添加元素的時(shí)候存儲(chǔ)的個(gè)數(shù)就會(huì)隨之改變。
- 鏈表和數(shù)組的優(yōu)缺點(diǎn)對(duì)比:
| 鏈表 | 運(yùn)行時(shí)確定大小,快速插入和刪除元素 | 不能隨機(jī)訪問,用戶必須提供編程支持 |
| 數(shù)組 | C直接支持,提供隨機(jī)訪問 | 在編譯時(shí)確定大小,插入和刪除元素很費(fèi)時(shí) |
- 在鏈表中有一個(gè)頭指針變量,這個(gè)指針變量保存一個(gè)地址,通過這個(gè)地址來找到這個(gè)鏈表,頭指針節(jié)點(diǎn)指向第一個(gè)節(jié)點(diǎn),在鏈表中每個(gè)節(jié)點(diǎn)包含兩個(gè)部分:數(shù)據(jù)部分和指針部分。雖然結(jié)構(gòu)體不能含有與本身類型相同的結(jié)構(gòu),但是可以含有之相同類型結(jié)構(gòu)的指針,這種定義是鏈表的基礎(chǔ),鏈表中每一項(xiàng)都包含在何處能找到下一項(xiàng)的信息。而最后一個(gè)節(jié)點(diǎn)的指針指向必須為空NULL,從鏈表的原理來看不用擔(dān)心鏈表的長(zhǎng)度會(huì)超出范圍這種問題。
- 鏈表的聲明
鏈表的基本操作
一、創(chuàng)建單鏈表
- 創(chuàng)建頭節(jié)點(diǎn)head,并且將當(dāng)前結(jié)點(diǎn)p指向頭結(jié)點(diǎn)(p=head);
- 創(chuàng)建下一個(gè)結(jié)點(diǎn)q,當(dāng)前結(jié)點(diǎn)p的下一結(jié)點(diǎn)為q(p->next=q);
- 結(jié)點(diǎn)p后移一位(p = p->next);
二、插入節(jié)點(diǎn)
- 判斷原鏈表是否是空鏈表,如果是,將head指向新增結(jié)點(diǎn);
- 如果不是空鏈表,向鏈表尾部插入新結(jié)點(diǎn);
三、刪除節(jié)點(diǎn)
ListNode *deleteNode(ListNode* head, int data){ListNode *p = head;// 首先判斷是不是空鏈表if (p == nullptr){return head;} else {// 判斷是不是刪除頭節(jié)點(diǎn)if (p->val == data){head = p->next;delete p;return head;} else {// 如果有該結(jié)點(diǎn),遍歷到待刪除節(jié)點(diǎn)的前一節(jié)點(diǎn)while (p->next != nullptr && p->next->val != data){p = p->next;}// 遍歷完整個(gè)鏈表都沒有待刪除節(jié)點(diǎn)if (p->next == nullptr){return head;} else {ListNode *deleteNode = p->next;p->next = deleteNode->next;delete deleteNode;return head;}}} }四、遍歷鏈表
- 定義一個(gè)用于遍歷的臨時(shí)指針,用while循環(huán)實(shí)現(xiàn)遍歷輸出等操作;
五、 查詢指定的節(jié)點(diǎn)(遍歷)
struct Node *FindNode(int a ) {struct Node *temp = head;while(temp != NULL) {if(a == temp->a) {return temp;}temp = temp->next;}return NULL; }六、鏈表清空
- FreeList函數(shù)仍是采用遍歷的方式一個(gè)一個(gè)的將節(jié)點(diǎn)內(nèi)存釋放,最后實(shí)現(xiàn)全部刪除的效果,但是要注意在最后應(yīng)該講頭尾節(jié)點(diǎn)至NULL否則下次的鏈表將會(huì)接著這次的頭尾。
七、反轉(zhuǎn)鏈表
- 假設(shè)pNode是當(dāng)前的節(jié)點(diǎn),pPrev是pNode前面的節(jié)點(diǎn),PNext是PNode后面的節(jié)點(diǎn),那么:
-
- 當(dāng)pNode不為nullptr,且pNext不為nullptr的時(shí)候:
① 將pNode指向pPrev(pNode->next = pPrev);
② 將pNode給pPrev(pPrev= pNode);
③ 將pNext給pNode(pNode = pNext);
- 當(dāng)pNode不為nullptr,且pNext不為nullptr的時(shí)候:
-
- 當(dāng)pNode不為nullptr,且pNext==nullptr的時(shí)候,把反轉(zhuǎn)后的頭部指向pNode;
八、倒數(shù)第K個(gè)節(jié)點(diǎn)
- 設(shè)置快慢指針,快指針比慢指針多走k-1步,那么快指針走到終點(diǎn)的時(shí)候,慢指針指向倒數(shù)第K個(gè)結(jié)點(diǎn);
九、判斷鏈表是否有環(huán)
- 可以設(shè)置快慢指針,快指針一次走兩步,慢指針一次走一步,如果快指針追上了走的慢的指針,那么鏈表有環(huán),如果走到了鏈表尾部都沒有追上,說明鏈表無環(huán)。
- 如果有環(huán),返回入口節(jié)點(diǎn):返回的節(jié)點(diǎn)一定在環(huán)內(nèi),如果計(jì)算出環(huán)中節(jié)點(diǎn)的個(gè)數(shù)count,快指針比慢指針多走count步,那么兩個(gè)指針相遇時(shí),就是環(huán)的入口節(jié)點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的【数据结构与算法】之链表的操作和使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数据结构与算法】之栈与队列的应用和操作
- 下一篇: OpenGL之仿“天体”运动渲染球体之间