在常数时间内快速单链接列表方法:O(1)

时间:2013-10-25 04:38:05

标签: c++ data-structures linked-list big-o time-complexity

我在单链接列表中编写了一个方法,该列表在列表的末尾插入一个对象。它以线性时间O(n)写成。

我如何执行相同的任务,但是代码是用恒定时间写的,O(1)?

线性时间码O(n):

template <class Object>
void List<Object>::insert_back( const Object& data ) {
    ListNode<Object>* newnode = new ListNode<Object>( data, NULL );
    ListNode<Object>* lastNode = head;
    while (lastNode->getNext()!= NULL && lastNode->getNext()->getElement() != data )
        lastNode = lastNode->getNext();
    lastNode->setNext( newnode );

}

1 个答案:

答案 0 :(得分:2)

通常,您有一个指向列表的头指针。为了达到你想要的效果,你需要一个尾指针。以下是尝试提供视觉效果。

 [ A -> B -> C -> D ]
   |              |
 (head)         (tail)

所以你的方法会变成(我不知道c ++,所以如果我错了,请纠正我,但这里的尾巴是一个字段。)

void List<Object>::insert_back( const Object& data ) {
    ListNode<Object>* newnode = new ListNode<Object>( data, NULL );
    ListNode<Object>* lastNode = tail;
    lastNode->setNext( newnode );
    tail = newnode;
}