1.虚拟头结点
1.1虚拟借点-node方法
/** * 获取index位置对应的节点对象 * @param index * @return */ private Node<E> node(int index) { rangeCheck(index); Node<E> node = first.next; for (int i = 0; i < index; i++) { node = node.next; } return node; }
1.2虚拟节点-添加、删除
@Override public void add(int index, E element) { rangeCheckForAdd(index); Node<E> prev = index == 0 ? first : node(index - 1); prev.next = new Node<>(element, prev.next); size++; } @Override public E remove(int index) { rangeCheck(index); Node<E> prev = index == 0 ? first : node(index - 1); Node<E> node = prev.next; prev.next = node.next; size--; return node.element; }
2.复杂度分析
数组
数组的特点随机访问/随机存取(读取和修改)特别快
index*4+数组首地址
时间复杂度为o(1)
数组删除和添加的时间复杂度
O(n) 这个n不一定就是参数 而是数据规模
最好O(1)
最坏O(n)
平均O(n)
最好O(1)
最坏O(n)
平均O(n)
链表
链表删除和添加的时间复杂度
最好O(1)
最坏O(n)
平均O(n)
链表的特点就是节省存储空间
注意
有些资料说 链表的添加删除操作时间复杂度是O(1) 指的是添加删除那一瞬间操作
不像数组一样需要把数据往后挪动
2.1数组的随机访问
2.2动态数组、链表复杂度分析
2.3动态数组add(E element)复杂度分析
注意
之前是 1+2+3+4+5+6+7+.....+n/n ==O(o)
2.4动态数组的缩容
注意
出现复杂度震荡 就是当
扩容倍数和缩容时机只要不要相乘等于1就不会出现复杂度震荡