【Java面试】十四、LinkedList相关

2024-06-09 1366阅读

文章目录

  • 1、单向链表
    • 1.1 结构
    • 1.2 查询的时间复杂度
    • 1.3 插入删除的时间复杂度
    • 2、双向链表
      • 2.1 时间复杂度
      • 3、ArrayList和LinkedList的区别是什么

        1、单向链表

        1.1 结构

        • 存储空间上,非连续
        • 链表的每个元素称结点Node
        • 每个结点包括两块:存储数据的数据域data、存储下一个节点地址的指针域next(后继指针)

          【Java面试】十四、LinkedList相关

          代码实现如下,假设链表中有个B结点,其下一个结点为C,则B.next == C

          【Java面试】十四、LinkedList相关

          1.2 查询的时间复杂度

          【Java面试】十四、LinkedList相关

          • 只有在查询头节点的时候不需要遍历链表,时间复杂度是O(1)
          • 查询其他结点需要遍历链表,时间复杂度是 O(n)

            1.3 插入删除的时间复杂度

            【Java面试】十四、LinkedList相关

            • 只有在添加和删除头节点的时候不需要遍历链表,时间复杂度是 O(1)
            • 添加或删除其他结点时,首先需要遍历链表找到对应节点后,才能完成新增或删除节点,因此时间复杂度是 O(n)

              2、双向链表

              每个结点有三部分:

              • 前驱指针prev
              • 数据域data
              • 后继指针next

                因此,可以支持双向遍历

                【Java面试】十四、LinkedList相关

                代码实现:

                【Java面试】十四、LinkedList相关

                2.1 时间复杂度

                查询时:

                • 查询头尾结点的时间复杂度是 O(1)
                • 平均的查询时间复杂度是 O(n)
                • 给定节点找前驱后继结点的时间复杂度为 O(1)

                  增删时:

                  • 头尾结点增删的时间复杂度为 O(1)
                  • 其他部分结点增删的时间复杂度是 O(n)
                  • 给定节点增删前驱后继结点的时间复杂度为 O(1)

                    3、ArrayList和LinkedList的区别是什么

                    1)底层数据结构上来说:

                    • ArrayList底层是一个数组
                    • LinkedList底层是一个双向链表

                      【Java面试】十四、LinkedList相关

                      2)操作数据的效率上来说:

                      • ArrayList 按照下标査询的时间复杂度 O(1),因为内存是连续的,可根据寻址公式取。而LinkedList 不支持下标查询
                      • 查找数据时(ArrayList未知索引): ArrayList需要遍历,链表也需要链表,时间复杂度都是 O(n)
                      • 新增和删除:ArrayList 尾部插入和删除,时间复杂度是 O(1),其他部分增删需要挪动数组,时间复杂度是 O(n)。LinkedList 头尾节点增删时间复杂度是 O(1),其他都需要先遍历链表找数据,时间复杂度是 O(n)

                        3)空间上来说:

                        • ArrayList底层是数组,内存连续,只存数据,节省内存空间
                        • LinkedList底层是双向链表,内存不连续,除了存数据,还要存两个指针,不节省内存

                          4)线程安全上来说:

                          • ArrayList 和 LinkedList 都不是线程安全的

                            PS:如果要保证线程安全,可考虑:

                            • 在方法内部的局部变量中用,局部变量,每个线程一份,无安全问题
                            • 使用Collections工具类,包装一下ArrayList 和 LinkedList(底层加了synchronized锁),就是线程安全的

                              【Java面试】十四、LinkedList相关

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]