面试被问 LinkedList中有a,b,c,d,e 5个元素,调用get(3)获取d,LinkedList查了几次??
我没看过这个源码,
下面看下源码吧,比较简单;
public E get(int index) {
// 就是判断索引超没超过链表长度范围或者小于0
checkElementIndex(index);
// 主要是看node方法
return node(index).item; // 调用node的item进行返回
}
Node<E> node(int index) {
// 这里开始进行二分了,如果index在链表前半部分正序查找,后半部分倒叙查找,这样就不用遍历整个链表了
if (index < (size >> 1)) { // (size >> 1) 其实就是size / 2,(向下取整)
Node<E> x = first;
// 开始向下遍历找到index的位置返回node
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
// 开始向上遍历找到index的位置返回node
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
第一步 其实就是检查index是否过大或者过小;
第二步 判断index在链表的前半部分还是后半部分;
第三步 前半部分正序遍历,后半部分倒叙遍历;
所以前面这个题应该是 2次就可以获取到d;