如何在链表中删除节点?

时间:2017-01-03 05:34:28

标签: sorting data-structures linked-list structure

在链接列表中执行删除节点操作时,我经常遇到代码:

**head=head->next**

其中'head'是链接列表,'next'是链接列表的组件,它将所有节点链接在一起。

此代码如何实际更改链接列表的成员(删除成员)。

2 个答案:

答案 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'访问链接列表时,您将检索第二个元素,旧的第一个元素不再出现在列表中。