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循环
2条答案
按热度按时间oiopk7p51#
举个例子,假设我们有这些元素链接列表:
现在假设您要删除最后一个元素,它的索引为4,所以我们称之为removeat(4)。为了从一开始就不遍历所有linkedlist,我们检查索引是否大于size/2。4<2 ? 假的。意思是我们从尾巴开始。node trav基本上是遍历linkedlist的指针。当到达特定索引时,只需调用remove方法并传递当前节点。移除(trav)。
klsxnrf12#
此函数唯一做的事情是在列表中查找指定的元素。实际的删除由最后一个调用中的另一个方法完成(
remove(trav)
).第一个
if
只检查列表中是否存在指定的索引。之后,它遍历列表,直到找到指定的元素。它使用一个临时节点
trav
. 迭代很简单:获取第一个对象->如果未达到索引,则获取下一个元素->获取下一个元素等等。但有一个转折点:如果索引位于列表的后半部分,它将从列表的末尾向后迭代。这是一个小的性能优化,因为它最多只有1/2次迭代。