巧妙刪除無頭單鏈表中的節點(算法中的“狸貓換太子”)


  最近看書看到了這樣一個問題:“刪除無頭單鏈表中的某個節點”。如果沒有“無頭”這個前提,那么這個問題應該不算是個問題了吧。這讓我想到了一句話,那就是“在企業中塑造不可替代性”,如果一個技能大家都會,那么這絕對不是你的特長,只有這個問題你會,那些人兒不會,那你才牛嘛,所以我們要會就會這種無頭單鏈表的刪除操作。可能有些人兒說了,那么這樣一寫出來,大家不就都會了嗎?我個人卻不是這樣想的,學點東西還怕人知道嗎,一個人要想真正有實力,靠的是不斷的學習,而不是學點東西怕人知道藏起來(個人觀點哦)。作為一個將要走出校門的大三學生,一直在努力提高自身的技能,希望在畢業的時候找到滿意的工作。好了,進入正題吧。

  問題的具體情況是這樣的,該單鏈表沒有頭結點,只有一個指針指向此單鏈表的中間的一個節點(不是第一個結點,也不是最后一個節點),請將該節點從單鏈表中刪除。假設存在一個這樣的鏈表:

    A -> B -> C -> D

現在,有一個指針pCurrent指向節點B(要刪除的節點),要刪除節點B,只需要讓節點A->next 指向節點C,這樣就完成了刪除,但是注意哦,這里的A節點實際上是沒有辦法獲得的,那么該怎么辦呢?看到這里,關鍵的部分就來了,現在讓我們來上演一出算法版的“狸貓換太子”,具體做法分為下面幾步:

1.B->data = C -> data;

2.B->next = C->next;

3.delete C;

實際上這樣完成刪除的,令節點B的數據為節點C的數據,然后刪除C,這樣就一種非常巧妙的方法完成了節點B的刪除。

還是給一個代碼:

 1 void DeleteNode(node *pCurr)
 2 {
 3      Assert(pCurr != NULL);
 4      node * pNext = pCurr->next;
 5      if(pNext != NULL)
 6      {
 7            pCurr->next = pNext->next;
 8            pCurr->data = pNex->data;
 9            delete pNext;
10      }
11 }

注意代碼中的是否為空檢查是非常有必要的,這考察了程序員編程風格和思維的縝密程度。最初看到這個“狸貓換太子”算法的時候有點小興奮哦。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM