我正在学习从FreeBSD的sys/queue.h
和我有一个问题:为什么sys/queue.h中的双链表保持上一个元素的地址?
在sys/queue.h
,LIST_ENTRY
定义如下:
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
为什么它保持以前下一个元素的地址(struct type **le_prev
)而不仅仅是以前的elment像struct type *le_prev
?
您的意思是说这个实现是为了防止反向遍历以及获得O(1)的插入和删除吗? – 2013-05-08 12:52:12
@YanzheChen(线性)列表操作的复杂性在使用单个指针时不会改变,并且双指针不会阻止向后遍历。我认为,重要的部分是“或一系列前锋指针”;当具有这样的(散列表)表格时,当先前指针的地址被存储时移除更便宜。 – ensc 2013-12-31 12:27:42
@ensc我读了这[post](http://stackoverflow.com/questions/9362896/deleting-any-node-from-a-single-linked-list-when-only-pointer-to-that-node- is-gi),并且明白如果它不是尾节点,则可以在O(1)中实现单链表中的删除。但是,为什么双指针不**防止向后遍历?如何执行反向遍历?我不明白**你提到的重要部分**。你能详细解释一下吗? – 2014-01-01 06:34:29