链表中的每一个元素称之为结点(Node)
物理存储单元上,非连续、非顺序的存储结构
单向链表:每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。记录下个结点地址的指针叫作后继指针 next
代码实现参考:
链表中的某个节点为B,B的下一个节点为C 表示: B.next==C
(1)查询操作
只有在查询头节点的时候不需要遍历链表,时间复杂度是O(1)
查询其他结点需要遍历链表,时间复杂度是O(n)
(2)插入和删除操作
而双向链表,顾名思义,它支持两个方向
每个结点不止有一个后继指针 next 指向后面的结点
有一个前驱指针 prev 指向前面的结点
参考代码
对比单链表:
双向链表需要额外的两个空间来存储后继结点和前驱结点的地址
支持双向遍历,这样也带来了双向链表操作的灵活性
(1)查询操作
查询头尾结点的时间复杂度是O(1)
平均的查询时间复杂度是O(n)
给定节点找前驱节点的时间复杂度为O(1)
(2)增删操作
头尾结点增删的时间复杂度为O(1)
其他部分结点增删的时间复杂度是 O(n)
给定节点增删的时间复杂度为O(1)
底层数据结构
ArrayList 是动态数组的数据结构实现
LinkedList 是双向链表的数据结构实现
操作数据效率
内存空间占用
ArrayList底层是数组,内存连续,节省内存
LinkedList 是双向链表需要存储数据,和两个指针,更占用内存
线程安全
大家好,我是xwhking,一名技术爱好者,目前正在全力学习 Java,前端也会一点,如果你有任何疑问请你评论,或者可以加我QQ(2837468248)说明来意!希望能够与你共同进步