美好的一天,
有人可以确认帖子底部的内容java - iterating a linked list 帖子提到您可以使用 for(char c:linkedlistofchars)语法,它仍然是O(n)。我想要访问一个看起来像这样的列表......
a b c d e f
实际上会在for循环的每次迭代期间在链表的开始处运行,就像这样......
a ab abc abcde abcdef
导致访问时间不是O(n)。
究竟是如何运作的?使用数组和数组运算符是有意义的,但java语法如何知道如何使用java中的 foreach 循环遍历链表?
我认为LinkedList数据结构只是一个额外的库,而不是核心语言语法的一部分。 (我确实知道LinkedList类在java中是标准的)
我希望我能够清楚地解释我的担忧....谢谢
答案 0 :(得分:10)
首先,任何实现Iterable
的类的实例都可以在foreach循环中使用。原因是编译后,for (Suit suit : suits)
实际上变为for (Iterator i = suits.iterator(); i.hasNext(); )
。有关详细信息,请参阅this explanation。
集合实现了特定于数据结构的优化迭代器。具体到LinkedList
,迭代器保留指向最后返回对象的指针,以允许恒定时间next()
和previous()
操作。因此,使用foreach-loop迭代链表将导致O(n)时间复杂度。您可以查看源代码以获取更多详细信息。
答案 1 :(得分:2)
此链接demonstrates the difference的代码示例。该链接的OP错误:调用list.get(i)
每次都会从列表的开头开始,然后计算到达i
,而iterator.next()
会将您的位置保存在列表中,所以每次调用时它只需要读取下一个值,而不是0和n之间的所有值。