O(1)实现单链表插入删除
阅读libevent源码时发现了linux提供的一个链表,宏定义如下。
#define LIST_ENTRY(type) \
struct { \
struct type *le_next; /* next element */ \
struct type **le_prev; /* address of previous next element */ \
}
不了解关于为什么prev指针取二重指针且指向前一元素的next指针的地址。
参考stackoverflow的描述后,结合源码捋一遍恍然大悟。
二重指针的用途在于可以在任一节点以O(1)的效率删除/插入节点。而且要说明下这不是double link list, 是单向链表。
因为墙看不到的话这是原话:
自己分析的O(1)实现链表插入|删除
设置文件描述符非阻塞io:
fcntl(fd, F_SETFL, O_NONBLOCK)