## LinkedList源码分析(二)
/**
* 检查下标是否正常
*
* @param index
*/
private void checkIndex(int index) {
if (index < 0 || index >= size) {
throw new IndexOutOfBoundsException("下标异常" + index);
}
}
/**
* 检查下标是否合法 用于添加元素
*
* @param index
*/
private void checkIndexAdd(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("下标异常" + index);
}
}
/**
* 检查截取新集合下标是否正常
*
* @param start 开始下标
* @param end 终止下标
*/
private void checkSubIndex(int start, int end) {
if (start >= end) {
throw new IndexOutOfBoundsException("下标异常,正确下标 start < end");
}
checkIndex(start);
checkIndex(end);
}
/**
* 取消链表中某一元素的prev next引用 将指定元素t出链表结构中 将该元素的前后连接元素连接到一起
*
* @param x 要取消的元素
* @return 返回被取消的元素
*/
E unlink(Node<E> x) {
final E element = x.item;//用来保存要取消连接的数据
final Node<E> next = x.next;
final Node<E> prev = x.prev;
//判断prev是否为空来确定是否是第一个元素
if (prev == null) {
first = next;
} else {
prev.next = next;//被取消元素前一个元素的next引用重新指向
x.prev = null;//清除被取消元素的prev引用
}
//判断next是否为空来确定是否是最后一个元素
if (next == null) {
last = prev;
} else {
next.prev = prev;//被取消元素的后一个元素的prev引用重新指向
x.next = null; // 清空被取消元素的next引用
}
x.item = null;//清空数据
size--;
return element;
}
/**
* 获取指定下标元素
*
* @param index 指定下标
* @return Node<E>元素
*/
Node<E> node(int index) {
if (index < size / 2) {
//当下标小于1/2size时,从first遍历
Node<E> temp = first;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp;
} else {
//当下标大于1/2size时,从last遍历
Node<E> temp = last;
for (int i = size - 1; i > index; i++) {
temp = temp.prev;
}
return temp;
}
}
}