哈希链表及其变种
来源:互联网 发布:旅游攻略软件下载 编辑:程序博客网 时间:2024/05/16 05:23
前言
先来直观的比较下普通链表和哈希链表:
普通链表
普通链表的表头和节点相同
哈希链表
哈希链表头
哈希链表节点
设计原理
Linux链表设计者认为双指针表头双循环链表对于HASH表来说过于浪费,因而另行设计了一套用于HASH表的hlist数据结构,
即单指针表头双循环链表。hlist表头仅有一个指向首节点的指针,而没有指向尾节点的指针,这样在海量的HASH表中存储
的表头就能减少一半的空间消耗。
这里还需要注意:struct hlist_node **pprev,也就是说pprev是指向前一个节点(也可以是表头)中next指针的指针。
Q:为什么不使用struct hlist_node *prev,即让prev指向前一个节点呢?
A:因为这时候表头(hlist_head)和节点(hlist_node)的数据结构不同。如果使用struct hlist_node *prev,只适用于前一个为节点
的情况,而不适用于前一个为表头的情况。如果每次操作都要考虑指针类型转换,会是一件麻烦的事情。
所以,我们需要一种统一的操作,而不用考虑前一个元素是节点还是表头。
struct hlist_node **pprev,pprev指向前一个元素的next指针,不用管前一个元素是节点还是表头。
当我们需要操作前一个元素(节点或表头),可以统一使用*(node->pprev)来访问和修改前一元素的next(或first)指针。
原理图如下:
常用操作
(1) 初始化
(2) 插入
(3) 删除
(4) 遍历
哈希链表变种
以下是作者的说明:
Special version of lists, where end of list is not a NULL pointer,
but a 'nulls' marker, which can have many different values.
(up to 2^31 different values guaranteed on all platforms)
In the standard hlist, termination of a list is the NULL pointer.
In this special 'nulls' variant, we use the fact the objects stored in
a list are aligned on a word (4 or 8 bytes alignment).
We therefore use the last significant bit of 'ptr':
Set to 1: This is a 'nulls' end-of-list maker (ptr >> 1)
Set to 0: This is a pointer to some object (ptr)
设计原理
当遍历标准的哈希链表时,如果节点为NULL,表示链表遍历完了。
哈希链表变种和标准哈希链表的区别是:链表的结束节点不是NULL。如果first或者next指针的最后一位为1,
就说明遍历到链表尾部了。
Q:为什么可以根据节点指针的最后一位是否为1来判断链表是否结束?
A:因为在一个结构体中,其元素是按4字节(32位机器)或者8字节(64位机器)对齐的。所以有效的节点指针的
最后一位总是为0。因此我们可以通过把节点指针的最后一位置为1,来作为结束标志。
原理图如下:
常用操作
(1) 初始化
(2) 判断是否为结束标志
(3) 获取结束标志
(4) 插入
把节点n插入为链表的第一个节点。
(5) 删除
(6) 遍历
同标准哈希链表的基本一样。
hlist_nulls_for_each_entry(tpos, pos, head, member)
hlist_nulls_for_each_entry_from(tpos, pos, member)
- 哈希链表及其变种
- 哈希链表及其变种
- Linux内核 - 哈希链表及其变种
- B树及其变种
- 螺旋矩阵及其变种
- bn 层及其变种
- 汉诺塔问题及其变种
- 快速排序及其变种算法
- LBP特征及其一些变种
- MVC 编程模式及其变种
- Josephus约瑟夫问题及其变种
- 二分查找算法及其变种
- 二分查找算法及其变种
- 快速排序及其变种 Java
- 二分查找及其变种总结
- Topic model的变种及其应用
- QuickSort及其变种算法的总结
- 约瑟夫环及其变种算法 java实现
- 关于在OJ提交的代码里的注释问题
- OnTriggerEnter与OnCollisionEnter
- Tensoflow学习记录12--resnet网络
- a[255]的值
- GitHub下载相关知识点
- 哈希链表及其变种
- 51NOD 1154 回文串划分 【DP+Manacher】
- 【蓝桥杯单片机组】(5)Timer0/1 计数器做频率计
- 蓝桥搜索题
- Leetcode 130. Surrounded Regions
- 【MSP430】UART库函数
- normal map
- 【MSP430】ADC12_init
- webapi在IIS发布注意事项