一系列链表题
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; }
之后遇到其他鏈表題的話還會繼續補充哦。
總結
- 上一篇: 成都大熊猫繁育基地门票优惠
- 下一篇: 静态多态之泛型编程(模板)