【问题标题】: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 元素。

              【讨论】:

                猜你喜欢
                • 2019-08-13
                • 1970-01-01
                • 1970-01-01
                • 2012-11-30
                • 1970-01-01
                • 1970-01-01
                • 2021-12-24
                • 2012-10-22
                • 1970-01-01
                相关资源
                最近更新 更多