日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

链表总结

發(fā)布時(shí)間:2025/3/15 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 链表总结 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈表是一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。每次添加一個(gè)節(jié)點(diǎn)時(shí)分配一次內(nèi)存。由于沒有閑置的內(nèi)存,鏈表的空間效率比數(shù)組要高。
常用的鏈表有:單向鏈表,雙向鏈表,循環(huán)鏈表
下面是一個(gè)單項(xiàng)鏈表添加節(jié)點(diǎn)和刪除節(jié)點(diǎn)的代碼

/*一個(gè)單向鏈表的節(jié)點(diǎn)定義如下*/ struct ListNode {int nValue;//數(shù)據(jù)域ListNode* pNext;//指針域 }; /*向鏈表末尾添加一個(gè)節(jié)點(diǎn)的C++代碼如下*/ void AddToTail(ListNode** pHead, int value){//第一個(gè)參數(shù)pHead是一個(gè)指向指針的指針,即*pHead指向頭結(jié)點(diǎn)ListNode* pNew = new ListNode();//定義一個(gè)新的節(jié)點(diǎn)。這句話可以理解為,動(dòng)態(tài)分配一個(gè)ListNode型的節(jié)點(diǎn),并使pNew指向該節(jié)點(diǎn)。pNew->nValue = value;pNew->pNext = nullptr;if(*pHead == nullptr)//如果是空鏈表,直接將頭指針指向新建立的節(jié)點(diǎn)*pHead = pNew;else{ListNode* pNode = *pHead; while(pNode->pNext != nullptr)pNode = pNode->pNext;pNode->pNext = pNew;} } /*在鏈表中找到第一個(gè)含有某值的節(jié)點(diǎn)并刪除該節(jié)點(diǎn)*/ void RemoveNode(ListNode** pHead, int value){if(pHead == nullptr || *pHead == nullptr)//首先判斷鏈表是否為空return;ListNode* pToBeDeleted = nullptr; //定義一個(gè)pToBeDeleted指針,用來(lái)指向待刪除的節(jié)點(diǎn)if((*pHead)->value == value){//如果頭結(jié)點(diǎn)即是待刪除節(jié)點(diǎn),則要將頭指針指向下一個(gè)節(jié)點(diǎn)pToBeDeleted = *pHead;*pHead = (*pHead)->pNext;}else{ListNode* pNode = *pHead;while(pNode->pNext != nullptr && pNode->pNext->nValue != value)pNode = pNode->pNext;if(pNode->pNext != nullptr && pNode->pNext->nValue == value){pToBeDeleted = pNode->pNext;pNode->pNext = pToBeDeleted->pNext;}}if(pToBeDeleted != nullptr){//此時(shí)pToBeDeleted指向了待刪除的節(jié)點(diǎn),用delete來(lái)釋放節(jié)點(diǎn)delete pToBeDeleted;pToBeDeleted->pNext = nullptr;} }

補(bǔ)一下new和delete的知識(shí)。
new和delete運(yùn)算符分別用于動(dòng)態(tài)分配內(nèi)存和動(dòng)態(tài)回收。用new動(dòng)態(tài)分配的內(nèi)存中存放隨機(jī)值,在使用前應(yīng)初始化。
在程序執(zhí)行過程中,如果希望根據(jù)輸入或計(jì)算的一個(gè)值來(lái)說(shuō)明一個(gè)數(shù)組的大小,用傳統(tǒng)的數(shù)組說(shuō)明語(yǔ)句是無(wú)法實(shí)現(xiàn)的,例如:

int n; cin>>n; float a[n];

編譯器指出數(shù)組a說(shuō)明無(wú)效,因?yàn)?strong>n不是常量。
但用new運(yùn)算符來(lái)申請(qǐng)分配內(nèi)存空間是可以的,例如:

int n; cin>>n; float *p = new folat[n];//申請(qǐng)n個(gè)動(dòng)態(tài)空間 p[0] = 1.1; ... delete []p;//回收動(dòng)態(tài)空間

相關(guān)面試題

單向鏈表反轉(zhuǎn)

LinkList* reverse(LinkList* head){LinkList* p, q, pr;p=head->next;pr=p->next;q = NULL;while(p!= NULL){p->next = q;q=p;p = pr;pr = p->next;}head -> next = q;return head; }

判斷鏈表中環(huán)的入口點(diǎn)

/* struct ListNode {int val;struct ListNode *next;ListNode(int x) :val(x), next(NULL) {} }; */ class Solution { public:ListNode* EntryNodeOfLoop(ListNode* pHead){if(pHead == NULL || pHead->next == NULL){return null;}ListNode* fast = pHead;ListNode* slow = pHead;while(fast != slow && fast->next != NULL && fast != NULL){slow = slow->next;fast = fast->next->next;}if(fast == slow){fast = pHead;while(fast != slow){fast = fast->next;slow = slow->next;}if(fast == slow){return fast;}}else{return null;}} };

查找鏈表的倒數(shù)第k個(gè)數(shù)
判斷鏈表是否有環(huán)

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的链表总结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。