2010-12-08 89 views
0

,我們怎麼刪除節點鏈表...?刪除中僅給出一個指向要刪除的節點鏈表

+1

單向鏈表?雙鏈表? – Jon 2010-12-08 12:39:41

+3

如果單鏈表然後重複:http://stackoverflow.com/questions/1960562/delete-a-node-in-singly-link-list如果雙向鏈表...不值得在採訪中提問:) – codaddict 2010-12-08 12:39:42

+1

此外,如果列表的對象是大的(即非平凡或只是昂貴的拷貝構造函數),那麼來自該重複的解決方案就是一個醜陋的黑客。看到codaddict的帖子。不切實際的面試問題是不切實際的。 :) – Kos 2010-12-08 12:46:23

回答

6

的問題是太曖昧,而且很可能是這樣的一個原因(例如產卵的對話,而不是測試的數據結構的實際知識)。他們很可能期待你問「這是一個雙向鏈表還是單鏈表?」如果它是一個雙向鏈表,它是一個簡單的事情:

curr->prev->next = curr->next; 
curr->next->prev = curr->prev; 
delete curr; 

如果它是一個單向鏈表,你必須有頭節點,以便您可以在列表中找到以前的節點。所以他們很可能期待你問你是否有指向頭節點的指針。然後,僞代碼將是:

loop from head to end until test->next == curr 
test->next = curr->next; 
delete curr; 

或者,如果你可以修改列表(沒有頭節點):

temp = curr->next; 
curr->data = temp->data; 
curr->next = temp->next; 
delete temp; 
2

我認爲它在單鏈表幾乎是不可能的,如果你沒有任何指針表頭。你應該總是有一個鏈表頭指針。

1

在一個標準的鏈表實現中,你的來修改指向被刪除節點的節點。要修改它,你必須先找到它。如果你有一個指向列表頭的指針,或者在刪除之前的任何元素,你可以通過遍歷列表來找到它。如果沒有,這個問題沒有通用的解決方案。

您可以通過修改鏈接列表的定義以某種方式標記刪除的節點(比如說,使用布爾屬性deleted),然後修改列表遍歷以跳過此類節點,從而避免出現這種情況。

3

那麼,它只是一招。

假設curr是給出的地址,以下將是僞代碼:

to_delete = curr->next 
curr->data = to_delete->data 
curr->next = to_delete->next 
delete to_delete 

本質上講,這只是複製數據和在列表中的下一個節點的下一指針到當前節點,並且刪除的下一個節點。

1
You have a pointer to that node (say, node N). Meaning, you have access on that node. 
If that node has pointer to it's front node and it's back node, then simply point the back node to the front node. And the front node to the back of your node N. 

To illustrate: 
step 1: 
---> [ node ] ---> [ node ] ---> [ node ] ---> 
<--- [ M ] <--- [ N ] <--- [ O ] <--- etc... 

step 2: 
---> [ node ] -----------------> [ node ] ---> 
<--- [ M ] <--- [node N] <--- [ O ] <--- etc... 

step 3: 
---> [ node ] -----------------> [ node ] ---> 
<--- [ M ] <----------------- [ O ] <--- etc... 

            [ node ] ---> (still points to node O) 
     (still points to node M) <--- [ N ] 

step 4: 
just point Node N to NULL 
            [ node ] ---> NULL 
          NULL <--- [ N ] 

result: 
---> [ node ] -----------------> [ node ] ---> 
<--- [ M ] <----------------- [ O ] <--- etc... 
1

我有一個解決方案,如果這不是尾巴。

如果它是一個單向鏈表,你只是「交換」與節點旁邊你和刪除一個代替。

假設我有

struct Node 
{ 
    T value; 
    Node * next; 
}; 

的解決辦法是這樣的:

void freeNode(Node * node) 
{ 
    Node * next = node->next; 
    if(next) 
    { 
     node->value = next->value; 
     node->next = next->next; 
     free(next); 
    } 
    // else I'm stuck! 
} 

上述排序C和C++的僞混合。

如果我們有節點是尾,並假設尾部由節點 - >顯示下一== NULL,我不能讓一個節點到尾,所以我也解決不了。