我在网上搜索这个问题,并得到它可以使用XOR链表或问题中的链表必须是双链表的ans。
但我认为这个问题本身并不完整,因为为了实现XOR链表功能,节点的下一个指针必须以合适的形式,即(下一个指针)XOR(上一个指针)。但是什么也没有给。
除非该列表是双链表,否则无法获取位置k之前的元素。如果每个节点都指向它的下一个节点,并且这是它携带的唯一连接,那么它应该如何访问前一个节点?可以把它看作是迭代:一旦调用了下一个值,就不能返回。
如果需要访问k之前的值,您可以1)在遇到元素时保存它们(可能不是一个好主意)或2)应该考虑使用另一种数据结构,这取决于实现。
可以使用XOR链表或内存高效链表。
假设你有LL: 1->2->***3***->4
,你的头指向3rd节点。
使用异或,我们知道:
1 -> NULL ^ 2
2-> 1 ^ 3
3-> 2 ^ 4
4-> 3^ NULL
所以这里为了找到2和1的地址,我们使用方程3 -> 2 ^ 4
我们知道3的地址(因为它是头)和4的地址(头)。所以如果我们对两边都进行异或运算,我们得到:
3^4 -> 2 ^ 4 ^ 4
(使用异或属性:0 ^ 0 ->
得到:3 ^ 4 -> 2
这意味着前一个元素是头元素和下一个元素的异或。
所以,这就是当第k个元素被指定为head时,XOR可以用来查找前一个元素的方法
不可能从任意随机(第k个)元素导航到它的邻居。您需要前任来导航到继任者。您需要继承者导航到继承者。为了满足这一要求,可以在头文件中存储一个指向第k和(k+1)个元素的指针。
如果你不能存储第(k+1)个元素,那么找到前一个元素的唯一方法就是从列表的开始(或结束)遍历,直到找到第k个元素——然后你可以往回走。
希望这对你有帮助。我从来没用过异链表。但这是我在这里发现的
如果链表的头指向第k个元素
那么,第一个元素在哪里?
如果它是一个单链表,并且给定的"头"实际上不是第一个元素,而是在中间的某个地方,那么没有真正的头,我认为在它之前的元素无法到达。
请问这是leetcode的问题吗?如果是,这是合理的。问题往往没有在网站上清楚地描述。
这里写的是head指向某个第k个元素。我们知道,在异或链表中,表头的指针包含NULL的XOR值和第二个元素的地址,所以在这种情况下,NULL和第二个元素的XOR值与第k个元素的地址相同;
i将head的指针保存在某个指针p中,并继续遍历异或链表,直到p的地址与当前节点匹配。
node* p = head->ptr;
node* prev = NULL;
node* curr = head;
node* next = NULL;
while(curr!=p && p)
{
next = xor(prev,curr->ptr);
print(curr->data);
prev = curr;
curr = next;
}
我们可以使用异或链表(内存高效链表)。
异或链表是下一个指针包含上一个节点地址和下一个节点地址的异或地址的链表。因此,当我们需要访问下一个元素时只需将其与前一个元素进行异或,反之亦然