C++ 恒定时间下的单链表表示法:O(1)
我在一个单链表中编写了一个方法,在列表的末尾插入一个对象。它是用线性时间O(n)表示的 我将如何执行相同的任务,但让代码以恒定时间O(1)编写 线性时间码O(n):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,
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;
}