C++ C+中的单链表操作+;复杂度为O(1)

C++ C+中的单链表操作+;复杂度为O(1),c++,linked-list,big-o,time-complexity,C++,Linked List,Big O,Time Complexity,我需要制作一个可以进行三次操作的链表。 所有这三种操作都必须具有O(1)复杂性 有关行动包括: 添加到尾部 从头部移除 返回中间节点 使用的节点结构如下所示: struct node { int data; node* link; node(int input) { data = input; link = NULL; } }; 对于移除头部,我只通过对头部节

我需要制作一个可以进行三次操作的链表。 所有这三种操作都必须具有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;
         }
    }
为了添加到tail,我通过引用tail节点实现了O(1)

    if(head != NULL) {
         tail->link = new node(input);
         tail = tail->link;
    }
    else {
         head = new node(input);
         tail = head;
    }
我的问题是返回中间节点。我知道如何遍历列表,但这意味着它将具有O(n)复杂性。我的主要想法是,如果我保持对中间节点当前位置的引用,我可以随时跟踪它。这与addtotail函数配合使用,因为我可以相应地向前移动中间节点。但是,删除头部不起作用,因为我无法继续向后移动中间引用,因为它必须是单链接列表

我已经被保证可以在O(1)中这样做,并且已经被暗示可以这样做的原因是因为这是列表将经历的唯一三个操作,因此中间节点有一个模式可以遵循

我想不出任何方法可以做到这一点,除非将从头部到中间节点的每个节点的引用保持为最小值,但有人告诉我,我不需要这样做来实现O(1)

任何帮助都将不胜感激

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


幸好你不必把中间部分向后移动!去掉头部只能使中间部分向前移动。

哦,我的天哪,我太傻了。我离它很近,想得太多了。谢谢你