📜  我们可以在Java实现异或链表吗?

📅  最后修改于: 2021-09-02 06:01:55             🧑  作者: Mango

正如我们都可以从下图中描述的那样,双重 LinkedList 需要两个链接字段才能存储下一个节点的地址和右节点的地址,对吗?所以异或链表通常充当双链表。 XOR 链表的每个节点只需要一个指针字段,它实际上并不存储实际的内存地址,而是存储其下一个和前一个节点的地址的按位异或。这导致内存节省。

首先阅读这个 – XOR Linked List – A Memory Efficient Double Linked List 现在想知道 XOR LinkedList 的节点是什么样子的。下面是它的样子:

其下一个和前一个节点的地址的异或

现在我们完成了双向链表的表示。您会想知道是否可以在Java实现? .

对此的答案非常简单和确定,因为在 C++ 中存在指针而在Java语言中不存在指针,因此无法在Java等编程语言中实现 XOR 链表。在JavaXOR 双向链表是不可能的,因为发生的情况是您无法访问任何对象的实际内存地址,如果没有引用它们的变量,垃圾收集器将删除这些节点。这在 C# 的情况下也是一样的。

使用此节点类的双向链表类将在遍历列表时跟踪最后一个节点。同样,您也可以通过对下一个节点的地址和当前节点的 XOR 指针进行 XOR 来向后遍历。虽然我们一次只存储一个前一个节点而不是每个节点的前一个节点,但我们节省了大量内存。众所周知,现在内存很便宜,所以异或双链表的概念只是理论上的,并没有实际应用。

如果我们需要对两个地址进行异或,我们需要将内存地址转换为整数,这在Java是不可能的。但是在 C++ 中,我们可以将 (Node*)、(int *) 的任何指针类型转换为任何数据类型,具体取决于您的机器(4 表示 32 位)和(8 表示 64 位)。 long 用于处理 C++ 中的指针,uintptr_t 也可用。既然我们不能在Java实现它,但是等等,我们不能用任何语言来做到这一点吗?是的,我们可以在 C/C++ 中。