C++ 恒定时间下的单链表表示法:O(1)

C++ 恒定时间下的单链表表示法:O(1),c++,data-structures,linked-list,big-o,time-complexity,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,

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

}
模板
无效列表::回插(常量对象和数据){
ListNode*newnode=新ListNode(数据,空);
ListNode*lastNode=头部;
while(lastNode->getNext()!=NULL&&lastNode->getNext()->getElement()!=data)
lastNode=lastNode->getNext();
lastNode->setNext(新建节点);
}

通常,您有一个指向列表的头指针。为了实现你想要的,你需要一个尾部指针。下面是一个试图给出视觉效果的例子

 [ A -> B -> C -> D ]
   |              |
 (head)         (tail)
所以你的方法会变成(我不知道C++,所以如果我错了,请纠正我,但是尾部这里是字段)。
void List::insert\u back(常量对象和数据){
ListNode*newnode=新ListNode(数据,空);
ListNode*lastNode=tail;
lastNode->setNext(新建节点);
tail=newnode;
}

保留指向列表中最后一个节点的指针。每次在末尾添加一个新节点时,将其更新为指向新的最后一个节点。@JerryCoffin我很难通过一些更改将其可视化,该函数可以修复为在列表为空时也能工作(
head
tail
为空)。@aschepler是的,我忘记了包括这些情况。我想我可以把它作为练习留给读者。
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;
}