数据结构与算法经典问题解析(Java语言描述)——一种存储高效的双向链表

寒假在家看《数据结构与算法经典问题解析(Java语言描述)》这本书,有一些没见过的东西或者对于工作或者考研复试有帮助的东西在这里记录一下。寒假第一周主要就看了链表,刷了leetcode链表的简单题,后面会依次写出来,先写这篇文章试试水。下面开始:
在双向链表常规实现中,需要一个指向后继结点的正向指针和一个指向前驱结点的反向指针。常规的结点定义:

class DLLNode{
		private int data;
		private DLLNode next;
		private DLLNode previous;
		......
		}

《Sinha》期刊中提出一种新的双向链表实现方式,该方式基于指针的差运算。每个结点仅使用一个指针域来双向地遍历链表。新结点定义如下:

public class ListNode{
		private int data;
		private ListNode ptrdiff;
		......
		}

ptrdiff指针字段包含后继结点的地址与前驱结点的地址的差。指针的差通过异或运算来实现。
ptrdiff = 后继结点的地址⊕前驱结点的地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200117224509100.png例图
例如考虑上图:
A的next指针为:NULL⊕B
B的next指针为:A⊕C
C的next指针为:B⊕D
D的next指针为:C⊕NULL

为什么要这样做呢?(这是由于⊕操作的属性…没大看懂)
我们来举个栗子:假设要从结点C移动到结点B,已知C的ptrdiff值为B⊕D,若想移动到B,将其与D的地址执行⊕运算:
(B⊕D)⊕D = B(因为D⊕D = 0)(很神奇吧!)其他结点的移动类似,不在一一列举。
综上所述,仅使用一个指针就可以实现在双向链表中来回移动,且不需要太多的时间开销。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值