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,但是顯然上述方法無法達到這一要求。所以紅字條件去掉之後就無法通過上述方法解決問題了。
啊