2015-06-28 65 views
1

我正在使用單個鏈接列表實現一個堆棧,其中Head位於堆棧的頂部,而Tail位於堆棧的底部。從鏈表開始刪除節點

我正在實施流行操作。爲了做到這一點,我必須使頭部等於鏈表中的第二個節點。但是在我這樣做之前,我需要首先刪除鏈表中的第一個節點。我可以使用delete head->next;來做到這一點。

我的問題是,如果我刪除第一個節點,我仍然可以使用它來移動到下一個節點?或者使用調用了delete的節點的引用是不好的做法。這是我想用來實現流行音樂的代碼。

delete head->next; 
head->next = head->next->next; 

回答

3

如果你這樣做:

delete head->next;

然後head->next是無效的。如果您嘗試在下一行中取消引用(請記住右側將在之前評估),那麼您的程序將崩潰。

head->next = head->next->!next; // dereference of the bad pointer happens where I put the !, and you crash there.

如果你想在head->next刪除的對象,你需要先保存它。

p = head->next; 
head->next = head->next->next; 
delete p; 
+0

究竟是'p'?你能夠輸出p的完整聲明嗎? – Ogen

+0

'p'與'head-> next'是相同類型的指針。我不知道這個類型是因爲你沒有在你的問題中發佈它,但是如果'next'是'foo *',那麼使'p'成爲'foo *'。如果你做其他事情,編譯器會抱怨。 – par

1

首先,一旦某物被刪除,它就消失了。不要訪問已刪除的內存。

二,你爲什麼說head->next = head->next->nexthead = head->next應該不夠流行?在一個空的列表中,head將是nullptr,不是嗎?第二,你爲什麼不使用std::list

最後,操作順序有時很重要,特別是當鏈接列表可能被多個線程共享時。這是我如何實現流行(並可選地使其多線程安全):

void list::pop() { 
    // optionally, acquire mutex 
    node* to_be_deleted = head; 
    head = head->next; 
    if (head == nullptr) tail = nullptr; 
    // release optional mutex here 
    delete to_be_deleted; 
} 
+0

在我的假設情況下,'head'是鏈接列表中第一個節點具有引用'next'的節點。現在我想到了,你是對的,「頭」應該只是一個指針。我只有一個問題。在你調用'to_be_deleted'上的刪除之後,它是否已經不在了? – Ogen