【问题标题】:How to change my Linked-List insert function from O(N) to O(1)如何将我的链表插入函数从 O(N) 更改为 O(1)
【发布时间】:2015-09-28 12:38:24
【问题描述】:

我实现了在末尾插入的linkedList 函数,但我使用了蛮力方法直到最后再添加它。我想将其更改为 O(1)。如果你们有任何提示,那就太好了。

【问题讨论】:

  • 您可以添加一个名为 tail 的成员变量,您需要在其他函数中处理该变量。
  • 是的,基本上存储一个指向列表末尾的指针并将其用于插入。按照惯例,删除和添加需要跟踪。
  • 不要忘记考虑到tail 在调用insertAtEnd() 时如果列表为空则为空。

标签: c++ insert nodes singly-linked-list


【解决方案1】:

实现这个 O(1) 的唯一方法是保持对 List 对象中最后一个 Object 的引用。每当在List 的末尾插入一个新对象时,指针就会更新为指向它。

【讨论】:

    【解决方案2】:

    您的实际问题已经得到解答:存储一个额外的尾指针,您可以在该尾指针处插入而无需遍历整个列表。

    还要看看你的代码:

    for (node; node->getNext() != NULL && node->getNext()->getElement() != data;)
         node= node->getNext();
    node->setNext(insertNode);
    

    for 循环中的第二个条件对我来说有点奇怪。如果您想使用 element == 数据附加一个新元素,您的循环将在具有该值的任何现有元素处停止,并且您将在它之前附加新分配的元素......并丢失从现有元素开始的所有旧元素元素 == 数据的节点。看起来像一个错误。

    【讨论】:

      【解决方案3】:

      正如其他人所说,您需要将tail 节点添加到您的列表中,然后您可以将这个实现用于insertAtEnd()

      template <class Object>
      void List<Object>::insertAtEnd(const Object& o)
      {       
          ListNode<Object>* insertNode = new ListNode<Object>(o, nullptr);
          if (!head) head = insertNode;
          if (tail) tail->setNext(insertNode);
          tail = insertNode; 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-10
        • 2010-10-24
        • 2017-11-14
        • 2015-04-07
        • 2013-06-26
        • 2022-01-13
        相关资源
        最近更新 更多