这是 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 语句,对头指针和前一个指针做了统一化处理。
头指针没有前一个指针,但有自己的地址,自己的地址自然还是指向自己。