在链接列表中执行删除节点操作时,我经常遇到代码:
**head=head->next**
其中'head'是链接列表,'next'是链接列表的组件,它将所有节点链接在一起。
此代码如何实际更改链接列表的成员(删除成员)。
答案 0 :(得分:2)
@Remy Cilia是正确的,但是关于你的星号的东西表明你在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
由于双指针头是原始头的地址,我们取消引用双指针以访问原始头部而不是它的副本。这样我们就可以重新指定原始指针。
答案 1 :(得分:1)
此代码将删除链接列表的第一个元素。
如果' head'是列表的第一个元素,' head-> next'是第二个要素。做' head = head-> next'将第二个元素移动到第一个位置。这样,下次使用' head'访问链接列表时,您将检索第二个元素,旧的第一个元素不再出现在列表中。