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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一系列链表题

發布時間:2023/11/30 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一系列链表题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、鏈表的倒序輸出:(輸出4,3,2,1)在這里,可以使用遞歸的方式:

<span style="font-size:18px;">void Reverse(pNode pHead) {if(pHead){Reverse(pHead->next);cout<<pHead->data<<"->"; } } </span> 2、刪除無頭單鏈表的非尾節點(不能遍歷)

思路:目前只給出了刪除的位置,既然不能遍歷,我們就無法知道刪除元素節點的前一個位置。這時候我們可以從它的后一個節點入手,可以刪除后一個節點,然后將后一個元素的值保留,賦給前一個節點的值。

如圖:



實現代碼:

<span style="font-size:18px;">void DeleteListNotTail(pNode *pHead,pNode pos) {assert(pHead);if(*pHead == NULL || pos->next == NULL)return;pNode pDel = pos->next;pos->next = pDel->next;pos->data = pDel->data;free(pDel); }</span> 3、在無頭單鏈表的非頭節點處插入一個節點(不能遍歷)

思路:可以在位置之后插入一個節點,然后交換兩個節點的值。



實現代碼:

<span style="font-size:18px;">void InsertNotHead(pNode *pHead,pNode pos,DataType data) {if(*pHead == NULL || pos == *pHead)return;pNode newNode = BuyNode(pos->data);newNode->next = pos->next;pos->next = newNode;pos->data = data; }</span>
4、查找單鏈表的中間節點

思路:可以定義快慢兩個指針,一個走一步,一個走兩步。當快指針到達終點時,慢指針就在中間位置。

在這里,還得分為奇數個節點和偶數個節點。(偶數個節點有兩個中間節點哦)


關于偶數個節點,我們該返回哪一個呢,如果返回3,就讓pFast指向NULL,如果返回2,就讓pFast->next指向NULL;

如果兩個都返回的話,就要用一個結構體來接收哦。



實現代碼:

<span style="font-size:18px;">pNode FindMidNode(pNode pHead) {assert(pHead);pNode pFast = pHead;pNode pSlow = pHead;//while(pFast && pFast->next) //偶數個節點時,中間節點返回后一個//{// pFast = pFast->next->next;// pSlow = pSlow->next;//}while(pFast->next && pFast->next->next) //偶數個節點時,中間節點返回前一個{pFast = pFast->next->next;pSlow = pSlow->next;}return pSlow; }</span>
5、查找倒數第K個節點(只能遍歷一次)

思路:用快慢兩個指針,先讓快指針先走K步,然后快慢指針一起向前走。當快指針指向NULL的時候,慢指針就指向倒數第K個節點。

這里強調的是走K步和走K-1步。(一個是后置--,一個是前置--,二者是不一樣的)

<span style="font-size:18px;">pNode FindLastK(pNode pHead,int k) {assert(pHead);int count = k;pNode pFast = pHead;pNode pSlow = pHead;if(pHead == NULL || k <= 0) //邊界條件判斷return NULL;/*while(count--) //pFast移動k次{if(pFast == NULL)return NULL;pFast = pFast->next; }while(pFast){pFast = pFast->next;pSlow = pSlow->next;}*/while(--count) //pFast移動k-1次{if(pFast == NULL)return NULL;pFast = pFast->next; }while(pFast->next){pFast = pFast->next;pSlow = pSlow->next;}return pSlow; } </span>

6、單鏈表的逆置/反轉

思路:用三個指針互相轉換,用2->1,然后再整體向后移動。直到所有的都鏈起來。


實現代碼:

pNode ReverseList(pNode pHead) //逆置 {assert(pHead);if(pHead == NULL || pHead->next == NULL)return pHead;pNode pPre = pHead;pNode pCur = pPre->next;pNode pNext = pCur->next;while(pNext){pCur->next = pPre;pPre = pCur;pCur = pNext;pNext = pNext->next;}pCur->next = pPre;pHead->next = NULL;return pCur; }

之后遇到其他鏈表題的話還會繼續補充哦。






總結

以上是生活随笔為你收集整理的一系列链表题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。