链式存储结构
1、单链表
节点构成:由两部分组成,其中一部分用于存储节点中的数据(data),另外一部分用于存储指向下一个节点的地址值(next)。
重要特点:只能从一个方向遍历单链表,因此也称之为“单向链表”。
注意事项:单链表的尾结点的next存储的为null
2、双链表
节点构造:由三部分组成,data用于存储节点中的数据,prev用于存储指向上一个节点的地址值,next用于存储指向下一个节点的地址值。
重要特点:既可以从前往后遍历链表,还可以从后往前遍历链表,因此也称之为“双向链表”。
注意事项:双链表的首节点的prev存储的为null,并且双链表的尾结点的next存储的为null
通过序号来插入节点,时间主要浪费在找正确的插入位置上,故时间复杂度为O(n)。但是,单论插入的操作,也就是无需考虑定位到插入节点的位置,那么插入操作的时间复杂度就是O(1)。
LinkedList类底层用双向链表实现的存储,也就意味着LinkedList类采用的是链式存储结构。在双链表中,每个节点中都有两个指针,分别指向直接前驱节点(保存前一个节点的地址值)和直接后继节点(保存后一个节点的地址值)。
LinkedList集合的特点为:查询效率低,增删效率高,线程不安全。
源码中Node类中包含了item、next和prev三个成员变量,其中item保存了节点中的内容,next和prev分别指向了后一个节点和前一个节点,则意味着Node类就是双向链表的节点类。
源码中first属性保存的就是双链表的首节点,last属性保存的就是双链表的尾结点,而size属性保存了双链表实际存放元素的个数。因此,对LinkedList的操作,其实就是对双链表的操作。