Java 【数据结构】 LinkedList【神装】

这篇具有很好参考价值的文章主要介绍了Java 【数据结构】 LinkedList【神装】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java 【数据结构】 LinkedList【神装】,【Java】登神长阶 史诗般的Java成神之路,java,开发语言

Java 【数据结构】 LinkedList【神装】,【Java】登神长阶 史诗般的Java成神之路,java,开发语言

 登神长阶 第二神装  LinkedList 


目录

🕶️一.LinkedList

🥼1.简介

 🦺2.LinkedList具体使用

👔2.1.构造方法

👕2.2.常见操作

👘2.3.遍历

🧢三.LinkedList的优缺点 与ArrayList的比较

🪖四.总结与反思


🕶️一.LinkedList

🥼1.简介

在集合框架中,LinkedList是一个普通的类,实现了List接口,具体框架图如下:

Java 【数据结构】 LinkedList【神装】,【Java】登神长阶 史诗般的Java成神之路,java,开发语言

Java 【数据结构】 LinkedList【神装】,【Java】登神长阶 史诗般的Java成神之路,java,开发语言

说明

   LinkedList是Java中提供的双向链表实现的数据结构。它实现了List接口,因此可以像操作普通的列表一样对其进行操作,同时也支持队列和栈的操作。与ArrayList相比,LinkedList在插入和删除元素时具有更好的性能,因为它不需要移动其他元素。但是在访问特定位置的元素时,LinkedList的性能较差,因为需要从头或尾开始遍历链表。总的来说,LinkedList适合频繁进行插入和删除操作的场景。 

注意

  1. LinkedList实现了List接口
  2. LinkedList的底层使用了双向链表
  3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
  4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
  5. LinkedList比较适合任意位置插入的场景

 🦺2.LinkedList具体使用

👔2.1.构造方法

方法 解释
LinkedList()

无参构造

public LinkedList(Collection<? extends E> c)

利用其他 Collection 构建 LinkedList

public static void main(String[] args) {
    // 构造一个空的LinkedList
    List<Integer> list1 = new LinkedList<>();
    List<String> list2 = new java.util.ArrayList<>();
    list2.add("JavaSE");
    list2.add("JavaWeb");
    list2.add("JavaEE");
    // 使用ArrayList构造LinkedList
    List<String> list3 = new LinkedList<>(list2);
}

👕2.2.常见操作

方法 解释

boolean add(E e)

尾插 e
void add(int index, E element) 将 e 插入到 index 位置
boolean addAll(Collection<? extends E> c) 尾插 c 中的元素

E remove(int index)

删除 index 位置元素

boolean remove(Object o)

删除遇到的第一个 o
E get(int index) 获取下标 index 位置元素
E set(int index, E element) 将下标 index 位置元素设置为 element
void clear() 清空
boolean contains(Object o) 判断 o 是否在线性表中
int indexOf(Object o) 返回第一个 o 所在下标
int lastIndexOf(Object o) 返回最后一个 o 的下标
List<E> subList(int fromIndex, int toIndex) 截取部分 list

举例

public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<>();
    list.add(1); // add(elem): 表示尾插
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    System.out.println(list.size());
    System.out.println(list);
    // 在起始位置插入0
    list.add(0, 0); // add(index, elem): 在index位置插入元素elem
    System.out.println(list);
    list.remove(); // remove(): 删除第一个元素,内部调用的是removeFirst()
    list.removeFirst(); // removeFirst(): 删除第一个元素
    list.removeLast(); // removeLast(): 删除最后元素
    list.remove(1); // remove(index): 删除index位置的元素
    System.out.println(list);
    // contains(elem): 检测elem元素是否存在,如果存在返回true,否则返回false
    if(!list.contains(1)){
        list.add(0, 1);
}
    list.add(1);
    System.out.println(list);
    System.out.println(list.indexOf(1)); /*indexOf(elem): 从前往
    后找到第一个elem的位置*/
    System.out.println(list.lastIndexOf(1)); /*lastIndexOf(elem): 从后
    往前找第一个1的位置*/
    int elem = list.get(0); // get(index): 获取指定位置元素
    list.set(0, 100); // set(index, elem): 将index位置的元素设置为elem
    System.out.println(list);
    /*subList(from, to): 用list中[from, to)之间
    的元素构造一个新的LinkedList返回*/
    List<Integer> copy = list.subList(0, 3); 
    System.out.println(list);
    System.out.println(copy);
    list.clear(); // 将list中元素清空
    System.out.println(list.size());
}

👘2.3.遍历

LinkedList 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器

public static void main(String[] args) {
    LinkedList<Integer> list = new LinkedList<>();
    list.add(1); // add(elem): 表示尾插
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    System.out.println(list.size());
    // foreach遍历
    for (int e:list) {
        System.out.print(e + " ");
    }
    System.out.println();
    // 使用迭代器遍历---正向遍历
    ListIterator<Integer> it = list.listIterator();
    while(it.hasNext()){
    System.out.print(it.next()+ " ");
    }
    System.out.println();
    // 使用反向迭代器---反向遍历
    ListIterator<Integer> rit = list.listIterator(list.size());
    while (rit.hasPrevious()){
    System.out.print(rit.previous() +" ");
    }
    System.out.println();
}

注意:

1. ArrayList最长使用的遍历方式是:for循环+下标 以及 foreach

2. 迭代器是设计模式的一种,后序接触容器后再做详细讲解

🧢二.LinkedList的优缺点 与ArrayList的比较

以下是对Java中LinkedList的优缺点的具体分析:

优点:

  1. 高效的插入和删除操作: 由于LinkedList是双向链表,插入和删除元素的时间复杂度为O(1),只需要修改相邻节点的指针,而不需要像数组那样移动元素。

  2. 灵活性: LinkedList可以灵活地调整大小,而不像数组需要提前分配固定大小的内存空间。

  3. 实现了多种接口: 除了List接口外,LinkedList还实现了Deque接口,因此可以用作队列或栈,支持先进先出(FIFO)和后进先出(LIFO)操作。

  4. 无需连续的内存空间: 与数组不同,LinkedList的元素在内存中不需要连续的空间,这使得它更适合在内存分配方面较为有限的情况。

缺点:

  1. 低效的随机访问: 要访问特定位置的元素,需要从链表的头部或尾部开始遍历,时间复杂度为O(n),这使得LinkedList在随机访问元素时性能较差。

  2. 占用更多的内存空间: 除了存储元素本身的空间外,每个节点还需要额外的空间来存储指向前后节点的指针,这使得LinkedList相比数组在存储相同数量的元素时占用更多的内存空间。

  3. 缺乏数组的一些优点: 与数组相比,LinkedList不支持直接通过索引访问元素,也不能在常量时间内获取列表的大小,这在某些情况下可能会导致性能下降。

综上所述,LinkedList适合于需要频繁执行插入和删除操作,而对随机访问性能要求不高的场景。在其他情况下,如需要频繁进行随机访问或需要节省内存空间时,可能更适合选择ArrayList或其他数据结构。

不同点 ArrayList LinkedList
存储空间上 物理上一定连续 逻辑上连续,但物理上不一定连续
随机访问 支持O(1) 不支持:O(N)
头插 需要搬移元素,效率低O(N) 只需修改引用的指向,时间复杂度为O(1)
插入 空间不够时需要扩容 没有容量的概念
应用场景 元素高效存储+频繁访问 任意位置插入和删除频

🪖三.总结与反思

💡努力是通往成功的钥匙,坚持是打开成功之门的手段。 ——奥巴马

        线性表的学习告一段落,我收获颇丰。

        学习了Java中的LinkedList,我深刻体会到了它作为一种数据结构的优缺点,以及在不同场景下的适用性。通过这次学习,我对链表这种数据结构有了更深入的理解,并从中汲取到了一些宝贵的经验和教训。

        首先,我认识到了LinkedList在插入和删除操作上的高效性。由于其采用了双向链表的结构,插入和删除元素的时间复杂度为O(1),这使得它在需要频繁进行这些操作的场景下表现出色。与之相对比的是,对于ArrayList这种底层基于数组的实现,在插入和删除元素时需要移动大量元素,性能相对较低。

        其次,我也意识到了LinkedList在随机访问元素时的劣势。由于链表的特性,要访问特定位置的元素需要从头或尾开始遍历,时间复杂度为O(n),这在大规模数据处理或需要频繁随机访问的场景下可能会导致性能下降。因此,在这些情况下,选择合适的数据结构显得尤为重要。

        另外,我也学会了如何灵活运用LinkedList。除了作为普通的列表外,它还可以用作队列或栈,支持先进先出和后进先出的操作,这使得它在不同的应用场景中都有着一定的灵活性。

        在反思这次学习的过程中,我意识到了数据结构的选择对程序性能和效率的影响是至关重要的。在实际开发中,需要根据具体的需求和场景选择合适的数据结构,不能一味追求某种数据结构的优势,而忽略了其劣势。同时,也要不断学习和积累经验,以便能够在面对不同的问题时做出更加明智的选择。

        综上所述,学习了Java中的LinkedList不仅增强了我的数据结构知识,还让我在实际编程中能够更加灵活地运用不同的数据结构,从而提高程序的性能和效率。这次学习不仅让我更加深入地了解了Java语言,也对编程能力的提升起到了积极的促进作用。


🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸文章来源地址https://www.toymoban.com/news/detail-850865.html

到了这里,关于Java 【数据结构】 LinkedList【神装】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构(Java实现)LinkedList与链表(上)

    链表 逻辑结构 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。 链表的实现 创建一个链表 遍历单链表 、 得到

    2024年02月11日
    浏览(51)
  • [java数据结构] ArrayList和LinkedList介绍与使用

    (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的模拟实现 5. LinkedList的优缺点 (四) ArrayList和LinkedList的区别

    2024年01月21日
    浏览(44)
  • java八股文面试[数据结构]——ArrayList和LinkedList区别

      ArrayList和LinkedList的异同 二者的线程都不安全,相对线程安全的Vector,执行效率高。此外,ArrayList时实现了基于动态数组的数据结构,LinkedList基于链表的数据结构,对于随机访问get和set,ArrayList觉得优于LinkedList比较占优势,因为LinledList要移动指针。对于新增和删除操作add

    2024年02月11日
    浏览(47)
  • java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

    对于数据结构我这边只告诉你右边框框里的 栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈 栈就像一个弹夹 队列先进先出后进后出 队列像排队 链表查询满 但是增删快(相对于数组而言) 拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素

    2024年02月05日
    浏览(46)
  • 【数据结构】链表与LinkedList

    作者主页: paper jie 的博客 本文作者:大家好,我是paper jie,感谢你阅读本文,欢迎一建三连哦。 本文录入于《JAVA数据结构》专栏,本专栏是针对于大学生,编程小白精心打造的。笔者用重金(时间和精力)打造,将javaSE基础知识一网打尽,希望可以帮到读者们哦。 其他专栏

    2024年02月08日
    浏览(47)
  • LinkedList数据结构链表

    LinkedList 在Java中是一个实现了 List 和 Deque 接口的双向链表。它允许我们在列表的两端添加或删除元素,同时也支持在列表中间插入或移除元素。在分析 LinkedList 之前,需要理解链表这种数据结构: 链表 :链表是一种动态数据结构,由一系列节点组成,每个节点包含数据部分

    2024年02月20日
    浏览(44)
  • 数据结构—LinkedList与链表

    目录 一、链表 1. 链表的概念及结构 1. 单向或者双向 2. 带头或者不带头 3. 循环或者非循环 二.LinkedList的使用  1.LinkedList概念及结构 2. LinkedList的构造 3. LinkedList的方法 三. ArrayList和LinkedList的区别           链表是一种 物理存储结构上非连续 存储结构,数据元素的 逻辑

    2024年02月04日
    浏览(49)
  • 【数据结构】LinkedList与链表

    上节课已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素: 由于其底层是一段连续空间,当 在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低 ,因此A rrayLi

    2024年02月07日
    浏览(44)
  • 【数据结构(三)】链表与LinkedList

    ❣博主主页: 33的博客❣ ▶️文章专栏分类:数据结构◀️ 🚚我的代码仓库: 33的代码仓库🚚 🫵🫵🫵 关注我带你学更多数据结构知识 在上一篇文章中,我们已经认识了顺序表,通过源码我们知道ArrayList底层是使用数组来存储元素,当在ArrayList任意位置插入或者删除元素时,

    2024年04月13日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包