文章目录
前言
本文主要介绍java中LinkedList基本操作并且进行源码分析。对于基本的数据结构来说,如果分析其源码无非是分析其保存的基本数据,继承结构分析,基本操作以及多线程下操作的影响。
一、是什么?
1.定义
双向链表
2.特点
插入和删除时间复杂度是O(1),
遍历时间复杂度是O(n)
线程不安全
二、源码继承结构
通过下图类的继承结构可以看到,LinkedList继承了List和Queue所以也会会实现其对应的能力。
三、基本操作
1.数据结点
可以看到数据结点包含一个前向和一个后向结点,所以可以实现双向。
代码如下:
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
2.常见操作
实现了queue的相关接口push、pull、pop、peek等这里就不做介绍,只介绍链表自己相关的。
2.1 新建
2.1.1 无参构造器
public LinkedList() {
}
2.1.1 有参构造器
调用的addAll方法可以批量初始化结点数据
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
2.2 新增
2.2.1 尾端添加
add(E e)、addLast(E e) -> linkLast(E e)
2.2.2 头部添加
addFirst(E e)-> linkFirst(E e)
2.2.3 指定位置插入
add(int index, E element)->linkBefore(E e, Node succ)||linkLast(element);
2.3 获取
2.3.1 获取头结点
E getFirst()
2.3.1 获取尾结点
E getLast()
2.4 删除
2.4.1 删除头结点
E removeFirst()->unlinkFirst
2.4.2 删除尾结点
E removeLast() ->unlinkLast
2.4.3 删除指定值节点
boolean remove(Object o)->unlink
2.5 遍历
实现了Iterator接口
总结
只要是链表只要能明确指针指向的结点只是保存的该结点的地址。则针对删除操作如果怕指针则可以暂存要删除的指针指向的地址,再去修改指定结点的next或者pre指向即可,