我正在编写一种算法,以从链表中删除最后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
}
此算法的总时间复杂度是多少?
答案 0 :(得分:1)
您的第一个循环O(1)从开始到第n个元素如何?由于n是您的最后一个元素,因此您实际上遍历了整个列表 您的第一个循环实际上具有O(N),并且由于您位于最后一个元素,因此不应该有下一个元素,并且不应该很快吗?.next!= nil condition false?