为什么我们不能手动遍历 LinkedList?
Why can't we manually iterate through a LinkedList?
LinkedList
是一种数据结构,其中每个元素都通过 link 耦合到其下一个元素。
因此,从理论上讲,此数据结构用于在执行任何操作(除了可能删除您当前所在的元素)的同时,以任何方向自由地遍历列表。
然而,在应用中,事实并非如此。从 LinkedList 返回 Iterator 受一般 Iterator
规则的约束(即迭代时不修改),甚至创建一个 ListIterator
,一个改进的 Iterator
,它允许修改 [=25] =] 迭代器的元素,让我们动态地 forward/backward,仍然有严重的限制:
如果您当前不在列表开头,则不能从列表开头删除元素,也不能将元素添加到列表末尾,除非您当前在列表末尾。
那么,有没有办法在对列表执行任何修改的同时自由地遍历 LinkedList
?如果没有,为什么没有?实现它不应该是这个数据结构的主要目标之一吗?
如果你想自由迭代使用数组或列表。链表旨在被遍历并访问对数据动态分配内存有用的数据。
此行为并非特定于 LinkedList
s。当您使用 ListIterator
迭代 List
(任何 List
)时,您只能在迭代器的当前位置进行结构更改(添加或删除元素)。否则,在 List
的结构更改后继续使用迭代器可能会产生意外结果。
要将元素添加到 LinkedList
的开头或结尾,您可以使用 addFirst
和 addLast
方法。您不必为了执行此操作而遍历 List
。
A ListIterator
实例维护一个状态,允许它定位下一个和前一个元素以及支持其他操作(删除当前元素,在当前位置添加一个元素)。如果您不通过 ListIterator
对 List
进行结构更改,迭代器的状态可能会变得无效,从而导致意外结果。因此,必须通过 ListIterator
.
进行所有结构更改
我猜 LinkedList
class 可以提供更复杂的迭代器的实现,它支持 addFirst
和 addLast
等操作。我不确定那会有多大用处,以及它是否证明增加的复杂性是合理的。
当你有一个链表数据结构时,你可以在一个特定的节点上添加或删除,当你的光标指向你想要添加或删除的正确节点时。
Inserts the specified element into the list (optional operation). The
element is inserted immediately before the element that would be
returned by next(), if any, and after the element that would be
returned by previous(), if any. The new element is inserted before
the implicit cursor: a subsequent call to next would be unaffected,
and a subsequent call to previous would return the new element. (This
call increases by one the value that would be returned by a call to
nextIndex or previousIndex.)
相反,如果它是一个数组结构,那么您可以按索引访问,并且可以在受数组长度限制的特定索引处添加或删除。 ArrayList 就是这样做的。
选择 all 迭代器 failfast 是一个设计决定,仅此而已。
没有什么能阻止您获取代码并以此为起点,如果您认为可以使用它,则为自己构建一个 NotSoFailFastIterator。然而,我认为一旦你看到它的行为及其在使用场景中的结果,你会很快恢复使用它,其中有真的大量并发activity在底层列表上进行你的迭代器。
LinkedList
是一种数据结构,其中每个元素都通过 link 耦合到其下一个元素。
因此,从理论上讲,此数据结构用于在执行任何操作(除了可能删除您当前所在的元素)的同时,以任何方向自由地遍历列表。
然而,在应用中,事实并非如此。从 LinkedList 返回 Iterator 受一般 Iterator
规则的约束(即迭代时不修改),甚至创建一个 ListIterator
,一个改进的 Iterator
,它允许修改 [=25] =] 迭代器的元素,让我们动态地 forward/backward,仍然有严重的限制:
如果您当前不在列表开头,则不能从列表开头删除元素,也不能将元素添加到列表末尾,除非您当前在列表末尾。
那么,有没有办法在对列表执行任何修改的同时自由地遍历 LinkedList
?如果没有,为什么没有?实现它不应该是这个数据结构的主要目标之一吗?
如果你想自由迭代使用数组或列表。链表旨在被遍历并访问对数据动态分配内存有用的数据。
此行为并非特定于 LinkedList
s。当您使用 ListIterator
迭代 List
(任何 List
)时,您只能在迭代器的当前位置进行结构更改(添加或删除元素)。否则,在 List
的结构更改后继续使用迭代器可能会产生意外结果。
要将元素添加到 LinkedList
的开头或结尾,您可以使用 addFirst
和 addLast
方法。您不必为了执行此操作而遍历 List
。
A ListIterator
实例维护一个状态,允许它定位下一个和前一个元素以及支持其他操作(删除当前元素,在当前位置添加一个元素)。如果您不通过 ListIterator
对 List
进行结构更改,迭代器的状态可能会变得无效,从而导致意外结果。因此,必须通过 ListIterator
.
我猜 LinkedList
class 可以提供更复杂的迭代器的实现,它支持 addFirst
和 addLast
等操作。我不确定那会有多大用处,以及它是否证明增加的复杂性是合理的。
当你有一个链表数据结构时,你可以在一个特定的节点上添加或删除,当你的光标指向你想要添加或删除的正确节点时。
Inserts the specified element into the list (optional operation). The element is inserted immediately before the element that would be returned by next(), if any, and after the element that would be returned by previous(), if any. The new element is inserted before the implicit cursor: a subsequent call to next would be unaffected, and a subsequent call to previous would return the new element. (This call increases by one the value that would be returned by a call to nextIndex or previousIndex.)
相反,如果它是一个数组结构,那么您可以按索引访问,并且可以在受数组长度限制的特定索引处添加或删除。 ArrayList 就是这样做的。
选择 all 迭代器 failfast 是一个设计决定,仅此而已。
没有什么能阻止您获取代码并以此为起点,如果您认为可以使用它,则为自己构建一个 NotSoFailFastIterator。然而,我认为一旦你看到它的行为及其在使用场景中的结果,你会很快恢复使用它,其中有真的大量并发activity在底层列表上进行你的迭代器。