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 语言结构体 ( 结构体中嵌套二级指针 | 为 结构体内的二级指针成员 分配内存 | 释放 结构体内的二级指针成员 内存 )

关于二级指针与一级指针相互转换的问题!