linus大神的二级指针

Posted AlphaABCD

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linus大神的二级指针相关的知识,希望对你有一定的参考价值。

普通人删除单向链表中的一个节点的时候都会这样写:

typedef struct node
{
    struct node * next;
    ....
} node;
 
typedef bool (* remove_fn)(node const * v);
 
// Remove all nodes from the supplied list for which the 
// supplied remove function returns true.
// Returns the new head of the list.
node * remove_if(node * head, remove_fn rm)
{
    for (node * prev = NULL, * curr = head; curr != NULL; )
    {
        node * const next = curr->next;
        if (rm(curr))
        {
            if (prev)
                prev->next = next;
            else
                head = next;
            free(curr);
        }
        else
            prev = curr;
        curr = next;
    }
    return head;
}

这里需要判断待删除的node是否头结点,导致了额外的指针定义(prev)和不必要的if判断(if (prev))。

而linus大神给出的代码如下:
通过使用二级指针,可以一致的对待头结点和其它节点,并且函数不需要再返回值了(因为可以通过输入的node**head在必要时直接修改链表头*head)。

void remove_if(node ** head, remove_fn rm)
{
    for (node** curr = head; *curr; )
    {
        node * entry = *curr;
        if (rm(entry))
        {
            *curr = entry->next;
            free(entry);
        }
        else
            curr = &entry->next;
    }
}

作者:胖子
链接:https://www.zhihu.com/question/477832027/answer/2044206446
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

以上是关于linus大神的二级指针的主要内容,如果未能解决你的问题,请参考以下文章

linus大神的二级指针

利用二级指针进行链表操作

为啥在访问二级指针时出现分段错误错误? C语言

向Linus学习,让代码具有good taste

20160210.CCPP体系详解(0020天)

20160210.CCPP体系详解(0020天)