2

我在单链接列表中编写了一个方法,该方法在列表末尾插入一个对象。它是用线性时间写的,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 );

}
4

1 回答 1

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;
}
于 2013-10-31T22:36:52.257 回答