Node<E>node(int 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;}}
时间复杂度对比:
索引位置
遍历方式
循环次数
0
正向
0
size/4
正向
size/4
size/2
正向
size/2
3size/4
逆向
size/4
三、完整API说明
3.1 公共方法列表
方法签名
功能说明
时间复杂度
boolean add(E e)
尾部插入元素
O(1)
boolean addFirst(E e)
头部插入元素
O(1)
boolean addLast(E e)
尾部插入元素
O(1)
boolean remove(Object o)
删除指定元素
O(n)
E get(int index)
获取指定位置元素
O(n)
void printLinkList()
打印链表结构
O(n)
3.2 私有方法列表
方法签名
功能说明
void linkFirst(E e)
内部头插法实现
void linkLast(E e)
内部尾插法实现
E unlink(Node x)
内部节点解链操作
Node node(int index)
索引节点定位方法
四、复杂度分析
4.1 时间复杂度
操作
最佳情况
最差情况
平均情况
插入头
O(1)
O(1)
O(1)
插入尾
O(1)
O(1)
O(1)
随机插入
O(n)
O(n)
O(n)
删除元素
O(1)
O(n)
O(n)
随机访问
O(n)
O(n)
O(n)
4.2 空间复杂度
总体空间:O(n)
每个节点需要额外存储两个指针(prev/next)
五、完整使用示例
5.1 基本操作
LinkedList<String> list =newLinkedList<>();// 添加元素
list.add("Java");
list.addFirst("Python");
list.addLast("C++");// 打印链表
list.printLinkList();// 输出:目前的列表,头节点:Python 尾节点:C++ 整体:Python,Java,C++,// 删除元素
list.remove("Java");System.out.println(list.get(1));// 输出:C++// 遍历访问for(int i =0; i < list.size(); i++){System.out.println(list.get(i));}
publicIterator<E>iterator(){returnnewLinkedListIterator();}privateclassLinkedListIteratorimplementsIterator<E>{privateNode<E> current = first;publicbooleanhasNext(){return current !=null;}publicEnext(){E item = current.item;
current = current.next;return item;}}
序列化支持:
privatevoidwriteObject(java.io.ObjectOutputStream s)throwsjava.io.IOException{
s.defaultWriteObject();
s.writeInt(size);for(Node<E> x = first; x !=null; x = x.next)
s.writeObject(x.item);}privatevoidreadObject(java.io.ObjectInputStream s)throwsjava.io.IOException,ClassNotFoundException{
s.defaultReadObject();int size = s.readInt();for(int i =0; i < size; i++)linkLast((E)s.readObject());}