首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么不使用ListIterator进行完整的LinkedList操作?

为什么不使用ListIterator进行完整的LinkedList操作?
EN

Stack Overflow用户
提问于 2019-08-16 16:55:33
回答 1查看 113关注 0票数 2

我的主要问题是,如果、ListIterator、Iterator类减少了从给定LinkedList中删除元素所花费的时间,那么可以这样说,同时使用上面的任何一个类在给定的LinkedList中添加元素。使用LinkedList类本身的内置函数有什么意义?当我们可以使用LinkedList函数以获得更好的性能时,我们为什么要通过ListIterator函数执行任何操作呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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>应该实现这些方法。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57528463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档