Tricks(三十六)—— remove_list_entry(无需 if 逻辑)

这是 TED 一期,对大神 Linus 的访谈

Node *head, *prev, *walk;
void remove_list_entry(Node* entry)
{
    prev = NULL;

    // walk 这一变量名,十分巧妙,
    // 变量命名的不二法门就是对应其物理(实际)意义
    walk = head;

    while (walk != entry)
    {
        prev = walk;
        walk = walk->next;
    }

    // 也即没有执行 while 循环,walk == entry,entry == head
    if (!prev)
        head = entry->next;
    else
        prev->next = entry->next;

}

为什么要区分是头指针呢,因为整个程序的逻辑是找到被删除指针的前一个指针,如果被删除的指针为头指针,显然其没有前一个指针。

显然这种的代码不具很好的 taste,话说 Jobs 也很爱讲 taste(Windows 最大的特点就是 has no taste)。

void remove_list_entry(Node* entry)
{
    Node **indirect;
    indirect = &head;
    while ((*indirect) != entry)
        indirect = &(*indirect)->next;
    *indirect = entry->next;
}

这两段代码的显著区别就是第二段代码省略了 if 语句,对头指针和前一个指针做了统一化处理。

头指针没有前一个指针,但有自己的地址,自己的地址自然还是指向自己。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值