下文提到的链表算法

时间:2019-06-27 13:07:05

标签: swift algorithm linked-list time-complexity

我正在编写一种算法,以从链表中删除最后N个节点,并将其附加到链表的前面(如下所示)

func removeAndAppendLastToFront(N: Int) {
    var slow: Node? = head
    var fast: Node? = head

    for _ in 0 ..< N - 1 {
        fast = fast?.next
    }

    var previous: Node?
    while fast?.next != nil {
        previous = slow
        slow = slow?.next
        fast = fast?.next
    }

    if previous != nil {
        previous?.next = nil
        fast?.next = head
        head = slow
    }
}

但是我在计算该算法的时间复杂度时遇到了一些困难。

据我了解,第一个for循环应为常数O(1)

 for _ in 0 ..< N - 1 {
        fast = fast?.next
 }

但是,第二个while循环又如何呢,考虑到快速指针已在第一个for循环内以线性时间转发,而第二个while循环仅从最后一个存储值继续进行,是否为O(log N)?

  while fast?.next != nil {
        previous = slow
        slow = slow?.next
        fast = fast?.next
  }

此算法的总时间复杂度是多少?

1 个答案:

答案 0 :(得分:1)

您的第一个循环O(1)从开始到第n个元素如何?由于n是您的最后一个元素,因此您实际上遍历了整个列表 您的第一个循环实际上具有O(N),并且由于您位于最后一个元素,因此不应该有下一个元素,并且不应该很快吗?.next!= nil condition false?