Mai*_*nID 7 algorithm data-structures
如何只用一个指针实现双链表?
找到prev和next节点需要O(1)时间.
struct Node
{
int val;
Node* p;
};
Run Code Online (Sandbox Code Playgroud)
Hen*_*man 10
有一个经典的黑客:存储2个指针(上一个和下一个)的XOR,当你在列表中旅行时,你手边总有一个(你刚从那里来)并且你可以用存储的值对其进行异或来获得其他指针.
不用说,这在GC环境中不起作用.
已经提出的一个解决方案是XOR解决方案.
另一种解决方案是"翻转方"解决方案:如果您的问题采用以下方式:
您将获得指向第一个元素的指针,并且您希望:
因此,始终只有一个指向链接列表的指针,并且只有一个入口点(只需返回和转发,如1和2),您可以执行以下操作:
所以你的列表看起来像这样:
p1 p2
| |
V V
i1 <- i2 <- i3 <- i4 i5 -> i6 -> i7
Run Code Online (Sandbox Code Playgroud)
p1指向当前元素,p2指向下一个元素,i1 ... i7是列表中的项目
前进是在O(1)中完成的,因此通过翻转指针向后移动:
Forward one step:
p1 p2
| |
V V
i1 <- i2 <- i3 <- i4 <- i5 i6 -> i7
Backward one step:
p1 p2
| |
V V
i1 <- i2 <- i3 i4 -> i5 -> i6 -> i7
Run Code Online (Sandbox Code Playgroud)
该解决方案在可读性方面优于XOR解决方案,并且对于人类来说更容易理解.缺点是您的链表不能有多个入口点.