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