首先了解下相关的数据结构:
struct hlist_node {
struct hlist_node *next, **pprev;
};
struct hlist_head {
struct hlist_node *first;
};
struct hlist_node {
struct hlist_node *next, **pprev;
};
哈希表我们一般用链接地址法来解决哈希冲突。一般我们想单链表即可解决问题,为什么内核要引入一个**pre呢?
了解下构造图:
可以看出 hlist_head和hlist_node 不是一个类型。这样要遍历的话需要做强制准换。
1.如果是单向链表,这样不方便删除当前节点。还需要从头遍历到前一个结点或者需要记录前一个结点。
2.双向链表的话 hlist_head 和 hlist_node 不是同一类型,开始遍历时候需要强制转换。
删除链表: