相对于数组,链表有几个优点。在列表特定位置插入元素是一个恒定时间的操作,而在数组中插入可能需要移动一半或更多的元素。
以上陈述对我来说有点误导性。请纠正我如果我错了,但我认为结论应该是: 数组:- 查找插入/删除点 O(1)
- 执行插入/删除 O(n)
- 查找插入/删除点 O(n)
- 执行插入/删除 O(1)
相对于数组,链表有几个优点。在列表特定位置插入元素是一个恒定时间的操作,而在数组中插入可能需要移动一半或更多的元素。
以上陈述对我来说有点误导性。请纠正我如果我错了,但我认为结论应该是: 数组:您是正确的,这篇文章将“索引”视为单独的操作。因此,插入本身是O(1),但到达中间节点的时间复杂度是O(n)。
插入操作本身的时间复杂度为O(1)。查找节点的时间复杂度为O(n)。
不,当你决定要插入时,假设你已经在遍历列表的中间。
对链表的操作通常不是作为一个通用的“列表”来处理,而是作为节点的集合——将节点本身视为主循环的迭代器。因此,在浏览列表时,您会注意到作为业务逻辑的一部分需要添加新节点(或删除旧节点),然后进行操作。您可能会在单次迭代中添加50个节点,每个节点只需要O(1)的时间来取消链接两个相邻的节点并插入新节点。
对于与数组进行比较的目的,正如图表所示,它是O(1),因为您不必移动新节点后面的所有项目。
因此,是的,他们假设您已经拥有指向该节点的指针,或者获取指针很容易。换句话说,问题陈述为:" 给定节点X,插入此节点后面的代码是什么?"您可以从插入点开始。
这个分析没有考虑到节点操作的发现(尽管它是必需的),只考虑了插入本身吗?
没错。在给定位置进行插入操作,假设您已经持有指向要插入的项之后的指针:
InsertItem(item * newItem, item * afterItem)
一旦你知道要放置的位置,插入操作的时间复杂度为O(1)。
不,它不考虑搜索。但是如果您已经获得了指向列表中间项目的指针,则在该点插入的时间复杂度为O(1)。
如果您必须搜索它,则必须添加搜索时间,这应该是O(n)。
因为它不涉及任何循环。
插入操作如下:
这在任何情况下都是常数时间。
因此,一个接一个地插入n个元素的时间复杂度为O(n)。
最常见的情况可能是在列表的开头或结尾插入项目(而且找到列表的末尾可能不需要时间)。
与此相比,在数组的开头或结尾插入项目则需要调整数组大小(如果在结尾,则需要调整数组大小;如果在开头,则需要调整并移动所有元素)。