Java 为什么可以';难道我们不能手动遍历LinkedList吗?

Java 为什么可以';难道我们不能手动遍历LinkedList吗?,java,doubly-linked-list,Java,Doubly Linked List,LinkedList是一种数据结构,其中每个元素都与指向其下一个元素的链接相耦合 因此,从理论上讲,这种数据结构是为了在执行任何操作(可能除了删除您当前所在的元素)的同时,以任意方向在列表中自由迭代而设计的 然而,在应用程序中,情况并非如此。从LinkedList返回迭代器要遵守常规的迭代器规则(即迭代时不进行修改),甚至创建一个列表迭代器,这是一个改进的迭代器,允许修改迭代器的下一个/上一个元素,让您动态地向前/向后移动,仍然有严重的局限性: 如果当前不在列表的开头,则不能从列表的开头删除元素

LinkedList
是一种数据结构,其中每个元素都与指向其下一个元素的链接相耦合

因此,从理论上讲,这种数据结构是为了在执行任何操作(可能除了删除您当前所在的元素)的同时,以任意方向在列表中自由迭代而设计的

然而,在应用程序中,情况并非如此。从LinkedList返回迭代器要遵守常规的
迭代器
规则(即迭代时不进行修改),甚至创建一个
列表迭代器
,这是一个改进的
迭代器
,允许修改迭代器的下一个/上一个元素,让您动态地向前/向后移动,仍然有严重的局限性:

如果当前不在列表的开头,则不能从列表的开头删除元素,也不能将元素添加到列表的末尾,除非当前在列表的末尾


那么,在对列表进行任何修改时,有没有一种方法可以自由地在
LinkedList
中迭代?如果没有,为什么没有呢?实现它不应该是这个数据结构的主要目标之一吗?

如果您想自由地迭代使用数组或列表。链表用于遍历和访问在动态分配数据内存时有用的数据。

如果要自由迭代,请使用数组或列表。链表用于遍历和访问对数据动态分配内存有用的数据。

此行为不特定于
LinkedList
s。使用
列表迭代器
迭代
列表
(任何
列表
)时,只能在迭代器的当前位置进行结构更改(添加或删除元素)。否则,在
列表的结构更改后继续使用迭代器可能会产生意外的结果

要将元素添加到
LinkedList
的开头或结尾,可以使用
addFirst
addLast
方法。您不必迭代
列表

ListIterator
实例维护一种状态,允许它定位下一个和上一个元素,并支持其他操作(删除当前元素,在当前位置添加元素)。如果不是通过
列表迭代器
列表
进行结构更改,迭代器的状态可能会变为无效,从而导致意外结果。因此,必须通过
列表迭代器
进行所有结构更改


我想
LinkedList
类可以提供一个更复杂迭代器的实现,它支持
addFirst
addLast
等操作。我不确定这会有多大用处,也不确定这是否会证明增加的复杂性是合理的。

这种行为并不特定于
LinkedList
s。使用
列表迭代器
迭代
列表
(任何
列表
)时,只能在迭代器的当前位置进行结构更改(添加或删除元素)。否则,在
列表的结构更改后继续使用迭代器可能会产生意外的结果

要将元素添加到
LinkedList
的开头或结尾,可以使用
addFirst
addLast
方法。您不必迭代
列表

ListIterator
实例维护一种状态,允许它定位下一个和上一个元素,并支持其他操作(删除当前元素,在当前位置添加元素)。如果不是通过
列表迭代器
列表
进行结构更改,迭代器的状态可能会变为无效,从而导致意外结果。因此,必须通过
列表迭代器
进行所有结构更改


我想
LinkedList
类可以提供一个更复杂迭代器的实现,它支持
addFirst
addLast
等操作。我不确定这会有多大用处,也不确定这是否会证明增加的复杂性是合理的。

当您有一个链表数据结构时,当光标指向要添加或删除的正确节点时,您可以在特定节点添加或删除

将指定的元素插入列表(可选操作)。这个 元素插入到将要插入的元素之前 由next()返回(如果有),并在将 由previous()返回,如果有。新元素将在之前插入 隐式游标:对next的后续调用将不受影响, 随后对previous的调用将返回新元素。(本 call将调用返回的值增加1 下一个索引或上一个索引。)


相反,如果它是一个数组结构,那么您可以通过索引进行访问,并且可以在受数组长度限制的特定索引处添加或删除。ArrayList就是这样做的。

当您有一个链表数据结构时,当光标指向要添加或删除的右侧节点时,您可以在特定节点上添加或删除

将指定的元素插入列表(可选操作)。这个 元素插入到将要插入的元素之前 由next()返回(如果有),并在将 由previous()返回,如果有。新元素将在之前插入 隐式游标:对next的后续调用将不受影响, 随后对previous的调用将返回新元素。(本 call将调用返回的值增加1 下一个索引或上一个索引。)

相反,如果它是一个数组结构,那么您可以通过索引进行访问,并且可以添加