C ++中的单一链接列表操作,复杂度为O(1)

时间:2015-10-20 02:50:02

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

我需要制作一个可以进行三次操作的链表。 所有这三个操作都必须具有O(1)复杂度。

有问题的行动是:

  • 添加到尾部
  • 从头部移除
  • 返回中间节点

正在使用的节点结构如下:

    struct node {
        int data;
        node* link;

        node(int input) {
            data = input;
            link = NULL;
        } 
    };

为了移除头部,我通过对头节点的通常引用实现了O(1)

    if (head != NULL) {
         if (head->link == NULL) {
            delete head;
            head = NULL;
            tail = NULL;
         }
         else {
            node* temp = head;
            head = head->link;
            delete temp;
         }
    }

为了添加到尾部,我通过引用尾节点

来实现O(1)
    if(head != NULL) {
         tail->link = new node(input);
         tail = tail->link;
    }
    else {
         head = new node(input);
         tail = head;
    }

我的问题是返回中间节点。我知道如何通过遍历列表来执行此操作,但这意味着它将具有O(n)复杂性。我的主要想法是,如果我保留对中间节点当前位置的引用,我可以随时跟踪它。这适用于Add to tail函数,因为我可以相应地向前移动中间节点。然而,它不能工作,因为它不能继续向后移动中间参考,因为它必须是单链表。

我已经确信可以在O(1)中执行此操作,并且已经暗示可以完成的原因是因为这些是列表将经历的唯一三个操作,因此存在一种模式中间节点要遵循。

我无法想到任何方式可以做到这一点,只需保持从头部到中间节点的每个节点的引用作为最低限度,但已被告知我不需要这样做来实现O(1)。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:2)

  

然而,移除头部并不起作用,因为我无法继续向后移动中间参考

好吧,你不必向后移动中间,然后!移除头部只能使中间向前移动。