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大神的二级指针的主要内容,如果未能解决你的问题,请参考以下文章