【问题标题】:What is the space and time complexity for this function that gets a node in a linked list based on its position from the tail?这个函数的空间和时间复杂度是多少,它根据从尾部的位置获取链表中的节点?
【发布时间】:2020-04-23 22:55:17
【问题描述】:

以下解决方案的空间和时间复杂度(最坏情况)是多少?

Node getNodeFromTail(Node head, int x){
    Node p = head;
    Node q = head;

    int diff = 0;

    while (p.next != NULL){
        p = p.next;

        if (diff >= x)
            q = q.next;
        else
            diff++;
    }
    return q;
}

这是上面代码的解释:
以这个链表为例:1 --> 2 --> 3 --> 4 --> 5

x == 尾部的值,
当 x 为 0 时,结果应为 5
当 x 为 1 时,结果应为 4
当 x 为 2 时,结果应为 3,依此类推。

这就是我的想法:
空间复杂性
常数空间O(1)

时间复杂度
while 循环在 O(n) 时间内遍历链表;
其中 n = 链表的长度。

但是,我认为由于 if 语句 存在额外的复杂性,我觉得应该是 O(n-x) 时间 因此给我们留下:O(n) * O(n-x),这几乎是 O(n^2)(即二次)的总体时间复杂度
我只是有一种感觉,在最坏的情况下,这不是完全线性的时间。
这是正确的吗?

参考:https://stackoverflow.com/a/31190255/12357170

【问题讨论】:

    标签: algorithm linked-list singly-linked-list


    【解决方案1】:

    时间复杂度为 O(n) 或线性。 while 循环的条件仅取决于循环内的 p = p->next 指令。循环内的其他指令是在恒定时间内执行的,对while循环的条件没有影响。因此,我们可以得出结论,循环恰好执行了 n 次(如果列表长度为 n 个元素)。
    另请注意,第一个 while 循环内没有其他循环,就像您在问题中建议的那样。

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 2017-09-11
      • 2020-05-03
      • 2021-07-03
      • 2015-09-27
      • 2011-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多