Java数据结构初阶——LinkedList

接下来博主会持续更新JavaSE、Java数据结构、MySQL、JavaEE、微服务、Redis等等内容的知识点整理。后续我也会精心制作算法解析、项目经验系列内容,内容绝对干货。相信这些文章能够成为我和大家的"葵花宝典",喜欢的话就关注一下吧!敬请期待!

文章目录

我们知道当在ArrayList任意位置插入或者删除元素时,就需要将后续元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。在此种场景下,使用LinkedList较好。

LinkedList的使用

LinkedList的底层是双向链表,具体是不带头、非循环的双向链表。

【说明】

  1. LinkedList与ArrayList一样也实现了List接口
  2. LinkedList没有实现RandomAccess接
    口,因此LinkedList不支持随机访问
  3. LinkedList的任意位置插入和删除元素时
    效率比较高,时间复杂度为O(1),所以 LinkedList比较适合任意位置插入、删除的场景

LinkedList的构造

java 复制代码
public static void main(String[] args) {
// 构造一个空的LinkedList
List<Integer> list1 = new LinkedList<>();
//对于第二个方法的使用:
List<String> list2 = new ArrayList
<>();//先构造一个ArrayList
list2. add("ab");
list2. add("cd");
list2. add("ef");
// 此时可以使用ArrayList对象来构造LinkedList,也就是第二个方法的使用
List<String> list3 = new LinkedList<>(list2);
}

LinkedList的常用方法介绍


注意:

  1. 可以看到LinkedList也有get(int index)方法,但是与ArrayList不一样,LinkedList仍不支持随机访问。get()方法底层还是通过遍历链表找到index下标,然后返回val,所以时间复杂度仍是O(n)。
  2. LinkedList中的subList与ArrayList一样,不是拷贝数据给到新链表,而是新链表共用了原链表的对应的一块空间。更改新链表会影响到原链表。

LinkedList的遍历

我们熟知可以使用for循环或者for-each来遍历链表,那我们也可以使用迭代器来实现对链表的遍历

java 复制代码
// 使用迭代器遍历---正向遍历
ListIterator<Integer> it1 = list.listIterator(); // 获取一个起始位置在列表开头的列表迭代器
while(it1.hasNext()){ // 判断游标后面是否还有元素
System.out.print(it1.next() + " "); // 返回游标后的下一个元素,并将游标后移
}
System.out.println();
java 复制代码
// 使用反向迭代器---反向遍历
ListIterator<Integer> it2 = list.listIterator(list.size()); // 获取一个起始位置在列表末尾的列表迭代器
while (it2.hasPrevious()){ // 判断游标前面是否还有元素
System.out.print(it2.previous() + " ");
}//先将游标向前移动一位,然后返回该游标位置后面的元素 。
//循环会从列表末尾开始,向前遍历至列表开头。
System.out.println();

ListIterator与Iterator区别

ArrayList和LinkedList的区别

链表相关面试题~

下面两篇文章中部分为链表算法面试题,文章中博主分 1. 解题思路 2. 代码实现及解析 3. 总结 三部分整理了算法的解析,有兴趣的可以练习下找找手感

  1. Java算法题解析(3)

  2. 快慢指针?约瑟夫?三步为你讲解链表精选算法题!

觉得文章对你有帮助的话就点个赞,收藏起来这份免费的资料吧!也欢迎大家在评论区讨论技术、经验

相关推荐
枕星而眠6 分钟前
C++ STL Map容器完全指南:从有序红黑树到无序哈希表
java·开发语言
geats人山人海42 分钟前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
爱吃牛肉的大老虎1 小时前
Rust对象之结构体,枚举,特性
开发语言·后端·rust
bbq粉刷匠1 小时前
HashMap 底层原理深度拆解(二):putVal 完整链路解析(懒加载 · 链表遍历 · 尾插法)
java·开发语言·哈希算法
Sam_Deep_Thinking1 小时前
一个靠谱的C端网关服务应该包含什么内容
java·程序员·系统架构
@三十一Y2 小时前
C++:红黑树的实现
开发语言·c++
杨运交2 小时前
[055][调度模块]Spring动态任务调度框架的设计与实现
java·后端·spring
白狐_7982 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
流云鹤2 小时前
03Java学习day(3)
java·学习
乐观勇敢坚强的老彭2 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法