问题描述
public T removeAt(int index) {
// Make sure the index provided is valid
if (index < 0 || index >= size) {
throw new IllegalArgumentException();
}
int i;
Node<T> trav;
// Search from the front of the list
if (index < size / 2) {
for (i = 0,trav = head; i != index; i++) {
trav = trav.next;
}
// Search from the back of the list
} else
for (i = size - 1,trav = tail; i != index; i--) {
trav = trav.prev;
}
return remove(trav);
}
解释这个遍历是如何去除双向链表的。 我不明白 for 循环
解决方法
这个函数唯一能做的就是在列表中找到指定的元素。实际删除是由最后一次调用 (remove(trav)
) 中的另一个方法完成的。
第一个 if
只是检查指定的索引是否存在于列表中。
之后,它遍历列表,直到找到指定的元素。它使用临时节点 trav
。迭代很简单:获取第一个对象 -> 如果未达到索引则获取下一个元素 -> 获取下一个元素等
虽然有一个转折点:如果索引在列表的后半部分,它会从列表的末尾向后迭代。这是一个小的性能优化,因为它最多只有 size/2 次迭代。
,举个例子,假设我们有这些元素 LinkedList:
[1,5,9,11,3]
indexes-> 0 1 2 3 4
size -> 5
现在假设您要删除索引为 4 的最后一个元素,因此我们调用 removeAt(4)。为了不从一开始就遍历所有 LinkedList,我们改为检查索引是否大于 size/2。 4