我的主要问题是,如果、ListIterator、或Iterator类减少了从给定LinkedList中删除元素所花费的时间,那么可以这样说,同时使用上面的任何一个类在给定的LinkedList中添加元素。使用LinkedList类本身的内置函数有什么意义?当我们可以使用LinkedList函数以获得更好的性能时,我们为什么要通过ListIterator函数执行任何操作呢?
发布于 2019-08-16 17:05:05
ListIterator
确实可以有效地移除它所处的节点。因此,您可以创建一个ListIterator
,使用next()
两次移动光标,然后立即删除节点。但很明显在实际搬迁之前你做了很多工作。
如果需要构造迭代器,使用ListIterator.remove
并不比通过LinkedList.remove(int index)
删除更有效的“时间复杂度”-wise。LinkedList.remove
方法要花费O(k)时间,而要删除的项的索引为k。使用ListIterator
删除该元素具有相同的时间复杂性,因为:(a)我们在恒定时间内创建一个ListIterator
;(b)我们调用.next()
k倍,每个操作在O(1)中;(c)我们调用.remove()
,这再次是O(1)。但是由于我们叫.next()
k倍,所以这也是一个O(k)运算。
对于任意位置(“插入”)上的.add(..)
,也会出现类似的情况,但我们这里当然要插入一个节点,而不是删除一个节点。
既然这两者具有相同的时间复杂度,人们可能会想知道为什么LinkedList
一开始就有这样的remove(int index)
对象。主要原因是程序员的方便。调用mylist.remove(5)
比创建迭代器更方便,使用循环移动五个位置,然后调用remove。此外,链接列表上的方法可以防止某些边缘情况,如负索引等。通过手动这样做,您可能会结束删除第一个元素,这可能不是预期的行为。最后,编写的代码有时会被多次读取。如果将来的读者阅读mylist.remove(5)
,他们就会明白它删除了第五个元素,在那里,一个循环的解决方案将需要一些额外的大脑周期来理解这个部分正在做什么。
正如@Andreas所说,而且List
接口定义了这些方法,因此LinkedList<T>
应该实现这些方法。
https://stackoverflow.com/questions/57528463
复制相似问题