最近看書看到了這樣一個問題:“刪除無頭單鏈表中的某個節點”。如果沒有“無頭”這個前提,那么這個問題應該不算是個問題了吧。這讓我想到了一句話,那就是“在企業中塑造不可替代性”,如果一個技能大家都會,那么這絕對不是你的特長,只有這個問題你會,那些人兒不會,那你才牛嘛,所以我們要會就會這種無頭單鏈表的刪除操作。可能有些人兒說了,那么這樣一寫出來,大家不就都會了嗎?我個人卻不是這樣想的,學點東西還怕人知道嗎,一個人要想真正有實力,靠的是不斷的學習,而不是學點東西怕人知道藏起來(個人觀點哦)。作為一個將要走出校門的大三學生,一直在努力提高自身的技能,希望在畢業的時候找到滿意的工作。好了,進入正題吧。
問題的具體情況是這樣的,該單鏈表沒有頭結點,只有一個指針指向此單鏈表的中間的一個節點(不是第一個結點,也不是最后一個節點),請將該節點從單鏈表中刪除。假設存在一個這樣的鏈表:
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 }
注意代碼中的是否為空檢查是非常有必要的,這考察了程序員編程風格和思維的縝密程度。最初看到這個“狸貓換太子”算法的時候有點小興奮哦。