編程之美:從無頭單鏈表中刪除節點,討論

1.問題描述

假設有一個沒有頭指針的單鏈表。一個指針指向此單鏈表中間的一個節點(不是第一個,也不是最後一個),請將該節點從單鏈表中刪除。

如下圖所示:

 這種情況大家都知道,將下一個節點的data和next拷貝到當前節點,並將當前節點的next設置爲下下個節點,然後釋放下一個節點所佔內存(free),

如果紅字條件去掉:

還用上面的方法就有問題,一般上面方法的代碼如下:

void DeleteRandomNode(Node* pCurrent)
{
     if(pCurrent == NULL)
            return;
     Node* pNext = pCurrent->next;     
     if(pNext == NULL)
     {
          //表明當前節點是最後一個節點
          pCurrent = NULL;//這裏如果爲最後一個節點就將當前指針設置爲NULL,這些寫法有問題!
     }
     pCurrent->data = pNext->data;
     pCurrent->next = pNext->next;
     
     delete pNext; 
}

    紅色註釋說明了問題:將pCurrent設置爲NULL並沒有改變當前節點的上一個節點的next值,因爲上一個節點的next存的是pCurrent指向的Node的地址。

    簡單來說就是pCurrent僅僅存了一個內存地址,而將pCurrent設置爲NULL這一行爲,並沒有改變上一節點的next值。如果當前節點是最後一個節點,那麼上一個節點的next值就應該爲NULL,但是顯然上述方法無法達到這一要求。所以紅字條件去掉之後就無法通過上述方法解決問題了。

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章