我编写了以下函数来反转链表,并且想知道'交换'的时间复杂性。我的理由如下: 它是o(n)
链接列表中的插入/删除是o(1),但这假设只是添加到尾部或从头部/尾部移除。在这里,您正在迭代并访问每个元素,并且访问链表中的元素是o(n)。 那是对的吗?一般来说,互换的时间复杂度是多少?
LinkedList.prototype.reverse = function () {
var previous = null;
var current = this.head;
var next;
while (current) {
//swap pointers
//cache iteration/temp var
next = current.next;
//point the next to the previous
current.next = previous;
//previous is the current one
previous = current;
//iterate
current = next;
}
//after you're done set the head to null (ie make it the tail)
this.head = null;
};
答案 0 :(得分:2)
链接列表算法的时间复杂度取决于您是否从要操作的列表中的位置开始。
如果你知道,插入/删除是O(1),如果你必须迭代找到它,则插入/删除是O(n)。
交换也是如此。
反转单链表是O(n),因为您必须触摸每个节点。有一种数据结构技巧,其中双向链表的反转是O(1)。你用一点来维持哪个方向算作“前进”。