【问题标题】:Express Singly-Linked List method in constant time: O(1)以恒定时间表示单链表方法:O(1)
【发布时间】:2013-11-04 01:27:11
【问题描述】:

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

}

【问题讨论】:

  • 保留指向列表中最后一个节点的指针。每次将新节点添加到末尾时,将其更新为指向新的最后一个节点。
  • @JerryCoffin 我无法想象这个

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


【解决方案1】:

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

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

【讨论】:

  • 通过一些更改,该功能可以修复为在列表为空时也可以工作(headtail 为空)。
  • @aschepler 是的,我忘了包括这些案例。我想我可以把它作为练习留给读者。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多