在執行鏈表中刪除一個節點運行,我經常用的代碼遇到:如何在鏈表中刪除一個節點?
**head=head->next**
其中「頭」是鏈表和「下一個」是一個把所有的鏈表的組件節點在一起。
該代碼如何實際更改鏈接列表的成員(刪除成員)。
在執行鏈表中刪除一個節點運行,我經常用的代碼遇到:如何在鏈表中刪除一個節點?
**head=head->next**
其中「頭」是鏈表和「下一個」是一個把所有的鏈表的組件節點在一起。
該代碼如何實際更改鏈接列表的成員(刪除成員)。
@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,而不是它的一個副本。這樣我們可以重新指定原始指針。
刪除功能可以返回更新的(如果需要)頭指針。這個調用將是head = delete(head,value),它會刪除第一個具有該值的節點,或者作爲另一個例子,它可能是head = deletefirst(head)。在內部使用雙指針仍然可以簡化代碼,但可以將單個指針作爲參數傳遞。 – rcgldr
@ rcgldr感謝您的替代答案。 – synchronizer
此代碼將刪除鏈接列表的第一個元素。
如果'head'是列表的第一個元素,'head-> next'是第二個元素。做'head = head-> next'將第二個元素移動到第一個位置。這樣,下次使用'head'訪問鏈表時,您將檢索第二個元素,並且舊的第一個元素不再在列表中。
我不確定哪種語言會使用這兩個星號。你的意思是* head = * head-> next? – synchronizer