如何将我的Linked-List插入函数从O(N)更改为O(1)

时间:2015-07-09 22:25:01

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

我实现了我在最后插入的linkList函数,但是我使用了暴力方法直到结束然后添加它。我想把它改成O(1)。如果你们有任何提示会很棒。

3 个答案:

答案 0 :(得分:6)

制作此O(1)的唯一方法是维护对Object对象中最后List的引用。每当在List的末尾插入新对象时,指针就会更新为指向它。

答案 1 :(得分:2)

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

但也要看看你的代码:

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

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

答案 2 :(得分:1)

正如其他人所说,您需要在列表中添加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; 
}