在本次Slashdot采访中,引用了Linus Torvalds的话:
我见过太多的人通过跟踪“上一个”条目来删除单链接列表条目,然后删除该条目,例如
如果(prev)
prev-> next = entry-> next;
否则
list_head = entry-> next;每当我看到这样的代码时,我都会说“这个人不理解指针”。可悲的是,这很普遍。
理解指针的人只使用“指向入口指针的指针”,并使用list_head的地址对其进行初始化。然后,当他们遍历列表时,只需执行“ * pp = entry-> next”,就可以删除条目而无需使用任何条件。
自从十年前在大学中介绍C以来,作为PHP开发人员,我从未碰过任何东西。但是,我觉得这是我至少应该熟悉的一种情况。Linus在说什么?老实说,如果我被要求实现一个链表并删除一个项目,那么上面的“错误”方法就是我要解决的方法。我需要了解Linus所说的最佳代码吗?
我在这里而不是在Stack Overflow上问,因为我在生产代码中实际上没有这个问题。
prev
而不是存储整个节点时,只需存储的位置prev.next
,因为这是您唯一感兴趣的内容。指针的指针。而且,如果这样做,就可以避免愚蠢的行为if
,因为从现在起,您不必再list_head
从节点外部成为指针了。然后,指向列表开头的指针在语义上与指向下一个节点的指针相同。