2011-05-13 193 views
1

我的列表項:從列表中刪除對象

typdef struct sNode 
{ 
    struct sNode* next; 
    myData data; 
} tNode; 

我希望實現以下API:

bool removeNode(tNode* node) 
{ 
... // need to fix list and free node 
} 

的問題是,我沒有以前的元素進行修改。 有沒有解決它的某種魔法?

回答

4

不需要。您必須從列表的開頭遍歷才能找到前一個節點,效率相當低。這是單鏈表的問題。如果您需要快速,請使用雙向鏈表(每個節點具有下一個以前的指針)。

+0

謝謝。但是在這種情況下,我也可以實現循環鏈​​表。在這種情況下,我不需要改變我的API或結​​構。然後我可以找到我的節點。我希望會有某種魔力 – user752716 2011-05-13 17:15:23

-1

是(幾乎) - 您可以將node->next的內容複製到node,然後刪除node->next

僞代碼:

sNode* next = node->next; // see below for an important special case 
node->data = next->data; 
node->next = next->next; 
free(next); 

我之所以說「幾乎」是,如果node沒有接班人,這並不工作。在這種情況下,你必須從頭開始遍歷列表。

此外,您必須考慮複製data的額外費用。

如果您經常通過指針刪除節點,您應該考慮一個單鏈表是否是正確的數據結構。例如,一個雙向鏈表沒有這個問題(但是每個節點確實有額外的額外開銷)。

+0

我不確定它會在節點是最後一項的情況下工作... – user752716 2011-05-13 16:36:24

+0

@ user752716:它不會。我已經修改了答案。 – NPE 2011-05-13 16:37:10

+0

我喜歡那種C風格的僞代碼:P – BlackBear 2011-05-13 16:52:03

1

您正在使用單個鏈接列表,如果要從列表中刪除節點,則應該從頭開始遍歷列表。所以,你需要改變你的API爲這樣的:

bool removeNode(tNode * head, tNode* node);