判断删除节点前驱是否为空,如果x前驱为空,则删除的节点是头节点;如果不为空,将x前驱节点的后继节点变为x的后继节点,再通过x.prev = null;切断x节点前驱连接。
判断删除节点后继是否为空,如果x后继为空,则删除的节点为尾结点;如果不为空,将x后继节点的前驱变为x的前驱节点,再切断x的后继连接。
最后将删除节点元素置空,size减小,modCount增加。
get(int index)函数 public E get(int index) { //检查索引 checkElementIndex(index); return node(index).item; } /** * Returns the (non-null) Node at the specified element index. */ Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }通过node(int index)查找index对应的节点,然后返回对应的数据item。其中size >> 1这个是指size右移一位即size/2 。
当index在前半部分,就从头开始查找
Node<E> x = first; for (int i = 0; i < index; i++) x = x.next; return x;当index在后半部分,就从last开始查找
Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; 六、LinkedList性能相关LinkedList 是不能随机访问的,按照索引访问效率较低,时间复杂度为复杂度为 O(N/2)
因此,LinkedList 删除一个节点的时间复杂度为 O(N) ,效率很高。