寒假在家看《数据结构与算法经典问题解析(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)(很神奇吧!)其他结点的移动类似,不在一一列举。
综上所述,仅使用一个指针就可以实现在双向链表中来回移动,且不需要太多的时间开销。