6

再会,

有人可以确认这篇文章底部所说的java - 迭代链接列表 该文章提到您可以使用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 中是标准的)

我希望我足够清楚地解释了我的担忧....谢谢

4

2 回答 2

11

首先,任何实现类的实例Iterable都可以在 foreach 循环中使用。原因是编译后,for (Suit suit : suits)实际上变成了for (Iterator i = suits.iterator(); i.hasNext(); ). 有关更多详细信息,请参阅此说明

集合实现优化的迭代器,特定于数据结构。具体来说LinkedList,迭代器保留一个指向最后返回对象的指针,以允许恒定的时间next()previous()操作。因此,使用 foreach 循环遍历链表将产生 O(n) 时间复杂度。您可以查看源代码以获取更多详细信息。

于 2012-06-15T01:52:04.987 回答
2

此链接上的代码示例演示了差异。该链接上的 OP 是错误的:list.get(i)每次调用都会从列表的开头开始,然后计数直到i到达,而 aiterator.next()会保存你在列表中的位置,所以每次调用它只需要读取下一个值,而不是 0 和 n 之间的所有值。

于 2012-06-15T01:37:51.463 回答