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

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

相关推荐
就叫_这个吧20 小时前
Java递归方法实现面包屑导航
java·开发语言
fīɡЙtīиɡ ℡20 小时前
AI 应用系统设计
java·开发语言·人工智能
小飞学编程...20 小时前
【哈希表】
数据结构·哈希算法·散列表
城管不管20 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
码匠许师傅20 小时前
【C++ 面试真题】26. 聊聊 C++ 的智能指针
java·c++·面试
AI绘画哇哒哒20 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
最强小杰21 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
今天AI了吗21 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
TELL5211 天前
selenium webdriver 第二次初始化的异常
开发语言·python
动词ing1 天前
【C语言】自定义函数+指针入门
c语言·开发语言·算法