LinkedList详解(源码详解)

LinkedList基本结构

LinkedList底层使用双向链表实现,可以进行向前和向后的遍历,以及头插和尾插,获取数值也可以获取头和获取尾。

Linked继承那些类,实现那些接口

同样LinkedList也是List接口的具体实现类
继承AbstractSqquentialList,实现了List,Deque,Cloneable,java.io.Serializable接口。
也就是说LinkedList不仅拥有List的方法实现,还有Deque的方法实现,也就是队列。
在这里插入图片描述

LinkedList允许重复?有序?允许为空?

让我们看一下LinkedList的add方法()
add方法内部直接调用LinkLast在尾部添加去添加数据
在这里插入图片描述
允许重复:在插入的时候并没有检查所有节点中是否有重复的
有序:插入是按照顺序插入的
允许为空:再进行添加时,并没有对null进行其他处理
在这里插入图片描述
结果:
在这里插入图片描述

LinkedList的底层结构与常用方法

前面提到LinkedList的底层实现结构是双向链表,我们来看一下底层源码的具体实现
我们可以看出这个LinkedList的节点引用有两个,一个指向前驱,一个指向后继。
在这里插入图片描述
并且还创建了两个节点,分别指向头和尾
在这里插入图片描述

构造器

无参构造器: public LinkedList() { }
什么都不做,因为链表的添加是链接节点不需要开辟空间等等

有参构造器:public LinkedList(Collection<? extends E> c)
这个方法直接将集合传了进去,调用了无参构造器,并且使用了继承自List的方法addAll,addAll的底层先把这个集合用toArray方法转成数组,之后遍历元素,一个一个的添加到链表中
在这里插入图片描述

public boolean add(E e)
直接调用LinkLast()方法,在尾部添加,虽然linkLast这个方法是默认访问,但并不支持我们使用,普通的添加就用add(E e)就好。添加成功则返回true。
在这里插入图片描述
public void add(int index, E element)
在指定位置添加节点,先判断下标合法性,不合法则抛出异常。
调用LinkBefore方法进行插入。
在这里插入图片描述
public void addFirst(E e)
头部添加,也就是头插。底层调用LinkFiest方法实现
还有尾插 也就是 public void addLast(E e)原理都是一样,代码极其相似
在这里插入图片描述
在这里插入图片描述

public boolean offer(E e)
底层直接调用add(E e)。也就是所谓的入队或者入栈

public boolean offerFirst(E e)
同理底层调用addFirst(E e)方法,在头部添加元素。
public boolean offerLast(E e)
同理底层底层调用addLast(E e)方法,尾部添加。
public void push(E e)
进栈方法
在这里插入图片描述

public E removeFirst()
删除头节点,如果第一个元素引用为null(也就是没有元素)直接抛出异常。
然后调用 private E unlinkFirst(Node f) 方法,删除元素,并返回原有元素。
在这里插入图片描述
在这里插入图片描述
public E removeLast()
删除尾结点,与删除头节点同理。调用的方法变成了unLinkLast();
public boolean remove(Object o)
删除链表中 o 对象。
地从先去遍历寻找该节点的位置,然后使用unlink()删除,删除成功则返回true。
在这里插入图片描述
public E remove(int index)
删除指定位置的节点,先检查索引合法性,不合法则抛出异常。使用node(index)方法寻找到此节点,然后再调用unlink(Node n)删除。值得一提的是,底层为了更快速的寻找,node()方法先判断了index 和 size/2 的大小,如果index 小,那么从前向后找,如果index 大,那么从后向前找。
在这里插入图片描述
在这里插入图片描述
public E pop()
也就是所谓的出栈当用链式结构实现栈时,进栈push(E e),使用的时头插法
在这里插入图片描述

public E set(int index, E element)
再指定位置修改元素的element,并且将原数据返回。
在这里插入图片描述

查询的方式LinkedList只提供了特定位置的位置的访问,头与尾。
public E peekFirst()
public E peekLast()

在这里插入图片描述
在这里插入图片描述
如果要访问其他节点则需要借助Iterator接口的方法去遍历链表访问。
与ArrayList相同同样具备快速失败机制。并且非线程安全

链表数据结构
有关单链表的扩展

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值