【问题标题】:If the head of a linked list is pointing to kth element, then how will you get the elements before kth element?如果链表的头部指向第 k 个元素,那么如何获取第 k 个元素之前的元素?
【发布时间】:2015-10-19 11:54:24
【问题描述】:
我在网上搜索了这个问题,得到了可以使用 XOR 链表 实现的答案,或者问题中的链表必须是 双向链表。
但我认为这个问题本身并不完整,因为要实现 XOR 链表函数,节点的下一个指针必须采用合适的形式,即 (下一个指针)xor(上一个指针)。但什么都没有给出。
给我一些好的解决方案。
【问题讨论】:
标签:
data-structures
linked-list
doubly-linked-list
xor-linkedlist
【解决方案1】:
不可能从任何随机(第 k 个)元素导航到其邻居。您需要前任导航到后继者。
您需要后继者导航到前任者。
为了满足这个要求,您可以在标题中存储指向第 k 个和第 (k+1) 个元素的指针。
如果你不能存储第 (k+1) 个元素,找到前一个元素的唯一方法是从开头(或结尾)循环遍历列表,直到找到第 k 个元素 - 然后你可以倒退.
希望这会有所帮助。我从未使用过异或链表。但这是我发现的here。
【解决方案2】:
如果链表的头部指向第k个元素
那么,第一个元素在哪里?
如果是单链表,并且给定的“头”实际上不是第一个元素,而是在中间某处,那么没有真正的头,我认为它之前的元素是无法到达的。
请问是leetcode的问题吗?如果是,那是合理的。网站中通常没有清楚地描述问题。
【解决方案3】:
除非列表是双向链表,否则无法获取位置 k 之前的元素。如果每个节点都指向它的下一个节点,并且这是它承载的唯一连接,那么它应该如何访问前一个节点?把它想象成一个迭代:一旦你调用下一个值,你就无法返回。
如果需要访问 k 之前的值,您可以 1) 在遇到元素时保存它们(可能不是一个好主意)或 2) 应考虑使用其他数据结构,具体取决于实现。
【解决方案4】:
这里写到 head 指向第 k 个元素。
我们知道在 XOR 链表中,head 的指针包含 NULL 的 xor 和第二个元素的地址,所以在这种情况下,NULL 和第二个元素的 xor 与第 k 个元素的地址相同;
我将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;
}
【解决方案5】:
我们可以为此使用 XOR 链表(内存高效链表)。
异或链表是一个链表,其下一个指针包含作为上一个和下一个节点地址的异或地址。因此,每当我们需要访问下一个元素时,只需将其与上一个元素进行异或,反之亦然。
【解决方案6】:
可以使用异或链表或内存高效链表。
假设你有 LL:1->2->***3***->4 并且你的头指向 3rd 节点。
使用 XOR 我们知道:
1 -> NULL ^ 2
2-> 1 ^ 3
3-> 2 ^ 4
4-> 3^ NULL
所以这里为了找到 2 和 1 的地址,我们使用公式3 -> 2 ^ 4
我们知道 3 的地址(因为它是 head)和 4 的地址(head.next)所以如果我们在两边 XOR 4 我们得到:
3^4 -> 2 ^ 4 ^ 4(使用 XOR 属性:0 ^ 0 -> 0)
我们得到:3 ^ 4 -> 2
这意味着prev元素是head元素和next元素的XOR。
所以,当第 k 个元素作为 head 时,这就是如何使用 XOR 来查找 prev 元素。