【问题标题】:Algorithm for deleting one element in an single linked list with O(1) complexityO(1) 复杂度的单链表中删除一个元素的算法
【发布时间】:2010-10-22 02:12:33
【问题描述】:

我是德国计算机科学专业的学生。我的教授给出了以下问题来思考:

'给定对单个链表中节点的引用(不是最后一个节点)。给出一个算法,在保持完整性的同时从列表中删除这个具有 O(1) 复杂度的元素。

我想过这个,但我很确定,没有这样的算法。因为它是一个单链表,你必须遍历链表中的每个节点,直到你到达应该删除的节点,因为你必须在删除之前修改节点中的下一个指针。这将导致 O(n) 复杂度。

我错过了什么吗?

【问题讨论】:

    标签: algorithm linked-list computer-science big-o


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      假设您有指向要删除的节点的指针。将下一个值复制到当前节点。将当前指针替换为下一个指向的节点。

      【讨论】:

        【解决方案3】:

        如果节点是内存中的基本结构,则可以将“next”节点的内容复制到已删除节点的内存位置,并释放“next”节点原来所在的内存。

        【讨论】:

          【解决方案4】:

          是的。你保留作为你的迭代指针,一个指向前一个列表的下一个指针的指针。

          walk = &head;
          while (!match(*walk)) {
              walk = &walk[0]->next;
              if (!*walk) return ;
          }
          *walk = walk[0]->next;
          

          【讨论】:

          • 删除部分是。链表上的更新迭代器应该总是使用指向下一个节点的指针。
          【解决方案5】:

          不完全考虑删除一个节点,但可以将下一个节点的数据复制到当前并删除下一个节点:

          // pseudocode:
          this.data = next.data;
          var temp = this.next;
          this.next = next.next;
          delete temp;
          

          【讨论】:

            【解决方案6】:

            这取决于节点是否可变(值)。

            一种方法,如果你可以对节点做你喜欢的事情:

            toDelete.value = toDelete.next.value
            toDelete.next = toDelete.next.next
            

            toDelete 中的所有信息现已被旧 toDelete.next 中的信息覆盖。 (根据平台,您可能需要释放旧的 toDelete.next - 这意味着保留对它的临时引用。当然,如果其他人仍然对它有引用,那就不好了。在 Java/C# 中,您只需忽略它。)

            我试图想出一种在不泄露的情况下暗示它的方法,但这有点棘手......

            它确实依赖于它不是列表中的最后一个节点。

            【讨论】:

            • 请注意,正如 Jon 解释的那样,要使其正常工作,Node 结构必须是私有的。 None 应该持有对节点本身的引用,只对数据。否则,消费者将得到对旧 toDelete.next 对象的无效引用(例如,如果您在 C++ 中并且删除了节点结构),或者充其量是无效节点对象。
            • 这真的不是从单链表中删除元素的“算法”吗?这是从列表中删除元素的标准方法。
            • @Dinuk:在您获得适当信息的链表中正常删除只涉及更新下一个(可能是上一个)链接 - 而不是将数据从“下一个”节点复制到这个节点上。至少,这是我通常会做的:)
            • 这里的问题是你没有指向前一个节点的链接,因此必须将删除后的节点移动到前一个节点指向的内存位置。否则,列表将被破坏。所以它与已知前一个节点的普通删除有点不同。
            猜你喜欢
            • 2011-05-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-03
            • 2021-06-21
            • 2019-10-08
            • 1970-01-01
            相关资源
            最近更新 更多