c++ - 在常数时间内表达单链表方法: O(1)

标签 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 );

}

最佳答案

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

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

所以你的方法将变成(我不懂 C++,所以如果我错了请纠正我,但这里的 tail 是一个字段。)

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;
}

关于c++ - 在常数时间内表达单链表方法: O(1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19581181/

相关文章:

c++ - 多线程 C++ 程序未使用 vector<thread> 和 .join() 并行运行

C++ 声明顺序(在多变量声明行中)

Java:多项选择游戏使用哪种结构

c - C--Linked List中的段错误

c - 链表数组初始化

c++ - 从 vector 中删除重复元素

c++ - Qt GUI 小部件源文件的重构/分区

time - 建议一种查找时间复杂度最小的好方法

java - 我可以使用什么数据结构来计算国家代码的出现次数?

java - 读取 .csv 文件并存储到 Java 中的链表