当前位置: 首页 > 知识库问答 >
问题:

C语言中的单向链表操作,复杂度为O(1)

徐涵亮
2023-03-14

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

有问题的操作是:

    < li >添加到尾部 < li >从头部移除 < li >返回中间节点

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

    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个答案

韦俊英
2023-03-14

然而,它不工作,与删除头部,因为没有办法,我可以继续向后移动中间的参考

好事情是你不必向后移动中间,然后!去掉头只能让中间往前走。

 类似资料:
  • 本文向大家介绍C语言之复杂链表的复制详解,包括了C语言之复杂链表的复制详解的使用技巧和注意事项,需要的朋友参考一下 什么是复杂链表? 复杂链表指的是一个链表有若干个结点,每个结点有一个数据域用于存放数据,还有两个指针域,其中一个指向下一个节点,还有一个随机指向当前复杂链表中的任意一个节点或者是一个空结点。今天我们要实现的就是对这样一个复杂链表复制产生一个新的复杂链表。 复杂链表的数据结构如下: 上

  • 本文向大家介绍C语言单链表常见操作汇总,包括了C语言单链表常见操作汇总的使用技巧和注意事项,需要的朋友参考一下 C语言的单链表是常用的数据结构之一,本文总结了单链表的常见操作,实例如下:

  • 据说 LinkedList 删除和添加操作的复杂性为 在 的情况下,它是 大小为“M”的数组列表的计算:如果我想删除第N个位置的元素,那么我可以使用index一次直接转到第N个位置(我不必遍历到第N个索引),然后我可以删除元素,直到此时复杂度为O(1),然后我必须移动其余的元素(M-N次移动),所以我的复杂度将是线性的,即O(M-N-1)。因此在最后删除或插入会给我最好的性能(如N ~ M ),而

  • 我将创建一个可以插入并显示到现在的链接: 这是我的初始化函数,只会为第一个

  • 主要内容:单向链表,循环链表,双向链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 使用链表结构可以避免在使用数组时需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去

  • 本文向大家介绍C语言链表完整操作演示,包括了C语言链表完整操作演示的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了C链表操作演示的具体代码,供大家参考,具体内容如下 头文件:link_0505.h 实现代码: link_0505.cpp 测试函数: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。