有人能解释一下双向链表中移除函数的遍历是如何工作的吗?

问题描述

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