2017-01-03 63 views
0

在執行鏈表中刪除一個節點運行,我經常用的代碼遇到:如何在鏈表中刪除一個節點?

**head=head->next** 

其中「頭」是鏈表和「下一個」是一個把所有的鏈表的組件節點在一起。

該代碼如何實際更改鏈接列表的成員(刪除成員)。

+0

我不確定哪種語言會使用這兩個星號。你的意思是* head = * head-> next? – synchronizer

回答

2

@Remy纖毛是正確的,但一些有關你的星號意味着你指的是這樣的事情在C:

int remove_first(node_t** head) 
{ 
    if (head == NULL || *head == NULL) return -1; 

    node_t* save = *head; 
    *head = save->next; 
    free(save); 

    return 0; 
} 

我們傳遞一個雙指針的功能是有原因的。如果我們通過一個單一的指針,我們會做這樣的:

int remove_first(node_t* head) 
{ 
    if (head == NULL) return -1; 

    node_t* save = head; 
    head = save->next; 
    free(save); // bad idea 

    return 0; 
} 

// before function call: 
head->node->next->NULL 
// during function call 
head->node->next->NULL 
head---^ 
// before return: 
    head->NULL next->NULL // (anyone can correct this line, but we can still free that node I believe) 
head-------------^ 
// after return: 
head->NULL next->NULL 

單指針剛剛創建的頭指針的副本 而非 修改原始,它從來沒有移動。

隨着雙指針:

// before function call: 
    head->node->next 
    // during function call 
    head->node->next 
head--^ 
    // before return: 
    head->next 
head--^ 
    // after return: 
    head->next 

由於雙指針頭是原廠頭的地址,我們去參考的雙指針訪問原始頭ponter,而不是它的一個副本。這樣我們可以重新指定原始指針。

+1

刪除功能可以返回更新的(如果需要)頭指針。這個調用將是head = delete(head,value),它會刪除第一個具有該值的節點,或者作爲另一個例子,它可能是head = deletefirst(head)。在內部使用雙指針仍然可以簡化代碼,但可以將單個指針作爲參數傳遞。 – rcgldr

+0

@ rcgldr感謝您的替代答案。 – synchronizer

1

此代碼將刪除鏈接列表的第一個元素。

如果'head'是列表的第一個元素,'head-> next'是第二個元素。做'head = head-> next'將第二個元素移動到第一個位置。這樣,下次使用'head'訪問鏈表時,您將檢索第二個元素,並且舊的第一個元素不再在列表中。