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. 快慢指针?约瑟夫?三步为你讲解链表精选算法题!

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

相关推荐
Lonely丶墨轩16 小时前
从登录入口窥见架构:一个企业级双Token认证系统的深度拆解
java·数据库·sql
好易学·数据结构16 小时前
可视化图解算法77:零钱兑换(兑换零钱)
数据结构·算法·leetcode·动态规划·力扣·牛客网
还债大湿兄16 小时前
huggingface.co 下载有些要给权限的模型 小记录
开发语言·前端·javascript
bkspiderx16 小时前
C++中的map容器:键值对的有序管理与高效检索
开发语言·c++·stl·map
Hard but lovely16 小时前
Linux: 线程同步-- 基于条件变量 &&生产消费模型
linux·开发语言·c++
独自破碎E17 小时前
【归并】单链表的排序
数据结构·链表
汤姆yu17 小时前
基于python大数据的协同过滤音乐推荐系统
大数据·开发语言·python
爱学习的小道长17 小时前
Python Emoji库的使用教程
开发语言·python
L_090717 小时前
【C++】高阶数据结构 -- 平衡二叉树(AVLTree)
数据结构·c++
冰冰菜的扣jio17 小时前
Redis基础数据结构
数据结构·数据库·redis