`

LinkedList

阅读更多
LinkedList

LinkedList源码解析转载自:https://www.cnblogs.com/CherishFX/p/4734490.html

线性表介绍转载自:https://www.jianshu.com/p/02f8696bf4cf

总结:LinkedList是基于双向链表实现的。其中的元素不存在下标索引,因此不适合于查找,但适合于添加(add)和删除(remove)。LinkedList进行插入和删除时,只需修改相邻元素的next和previous的引用即可,即重新指向next和previous的引用。

数据结构:prev | data | next 。(LinkedList内部类Node中指定了这三个属性)
集合中每个元素处存储了当前元素值,当前元素前一个元素的指针,当前元素后一个元素的指针。

Question1:LinkList如果需要根据下标(index)进行查询,底层是如何进行的?
Question2:LinkedList具体是如何实现随机访问的?即,具体是如何定义index这个参数的?
注:以下的两个问题均为一个意思,只是进行不同的论述。
在源码中,Node<E> node(int index)方法是得到索引index所指向的Node节点的。具体实现为:
 //返回指定索引位置的节点
    Node<E> node(int index) {
        // assert isElementIndex(index);
        //折半思想,当index < size/2时,从列表首节点向后查找
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {  //当index >= size/2时,从列表尾节点向前查找
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

        该方法返回双向链表中指定位置处的节点,而链表中是没有下标索引的,要指定位置出的元素,就要遍历该链表,从源码的实现中,我们看到这里有一个加速动作。 源码中先将index与长度size的一半比较,如果index<size/2,就只从位置0往后遍历到位置index处,而如果 index>size/2,就只从位置size往前遍历到位置index处。因此,LinkedList不适合根据指定索引值进行查找。

ArrayList和LinkedList的区别:
1:ArrayList是实现了基于动态数组的数据结构,LinkedList基于双向链表的数据结构。 
2:对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针去遍历查找。 
3:对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,调用System.arrayCopy( ),比较消耗资源。

java如何实现双端队列或者说如何区别双端队列和单端队列?
双端队列:队列的一端能分别当头部和尾部使用。
单端队列:队列的一端只能当头部或尾部使用。
java在实现单端队列的时候,只提供add元素的时,只能add到元素的尾部,取出元素的时,只能从元素的头部取出。实现双端队列的时候,多提供几个方法,addFirst是加到队列的头部,addLast是加到队列的尾部。removeFirst是删除队首,removeLast是删除队尾。这种实现就区分了双端队列和单端队列。

分享到:
评论

相关推荐

    List-LinkedList 单链表就地反转

    ### List-LinkedList 单链表就地反转 #### 概述 本文主要介绍单链表的就地反转算法实现,并通过具体的C语言代码示例来解释这一过程。单链表是一种常见的线性数据结构,其中每个元素包含一个指向下一个元素的指针。...

    使用LinkedList模拟堆栈

    本文将详细讲解如何使用Java中的LinkedList类来模拟这两种数据结构,并实现其基本操作。 堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它遵循“先进后出”的原则。常见的堆栈操作有压栈...

    ArrayList LinkedList Vector区别

    ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...

    java中LinkedList任意排序实例

    在Java编程中,LinkedList是一个非常重要的数据结构,它实现了List接口,允许我们在列表的任何位置进行插入和删除操作。LinkedList内部使用双向链表实现,因此它的遍历速度比ArrayList快,但随机访问性能较差。本...

    创建一个 LinkedList项目.docx

    LinkedList 是 Java 中的一种数据结构,属于线性数据结构的一种,但它与数组有着本质的不同。数组在内存中存储元素是连续的,而 LinkedList 则通过节点之间的引用相互连接,每个节点包含元素本身、指向前一个节点的...

    LinkedList的实现.zip

    LinkedList是计算机科学中的一种基本数据结构,特别是在C++编程中,它被广泛用于处理动态集合。LinkedList的主要特点是每个元素(称为节点)包含数据以及指向下一个节点的指针,这种结构使得在列表中间添加或删除...

    JAVA利用LinkedList构造栈与队列

    在Java编程语言中,LinkedList是一个常用的集合类,它实现了List接口,同时也提供了双向链表的实现。LinkedList不仅可以作为列表使用,还可以被巧妙地利用来构建栈(Stack)和队列(Queue)这两种基本数据结构。在本...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    java LinkedList的添加删除操作

    在Java编程语言中,LinkedList是一种线性数据结构,属于集合框架的一部分,实现了List接口和Deque接口。LinkedList以链表的形式存储元素,这使得它在添加和删除元素时具有较高的效率,尤其是在列表的中间或开头进行...

    Java 中Linkedlist类的源代码

    在Java编程语言中,LinkedList是一个实现List接口的类,它以双向链表的形式存储元素。这个数据结构允许我们在列表的任何位置进行插入和删除操作,具有O(1)的时间复杂度,这使得LinkedList在需要频繁进行这些操作时比...

    ArrayList和Linkedlist1

    在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能至关重要。面试官询问这些知识点,旨在评估应聘者的理论基础和实践能力...

    比较ArrayList、LinkedList、Vector1

    【ArrayList、LinkedList、Vector对比分析】 1. **List概述** List接口是Java集合框架中的重要组成部分,它是一个有序的集合,允许重复元素,并且保持插入顺序。List接口的实现类主要有ArrayList、LinkedList和...

    java中LinkedList集合类实现栈和队列.doc

    在Java编程语言中,LinkedList集合类是一个非常重要的数据结构,它可以用来实现栈和队列这两种特殊的数据结构。LinkedList是一个双链表,每个节点包含数据元素和两个引用,分别指向前后节点,这使得在列表中进行插入...

    Java中ArrayList和LinkedList区别 时间复杂度 与空间复杂度1

    在 Java 中,ArrayList 和 LinkedList 是两种常用的集合类,它们各自具有不同的特性和适用场景,主要体现在数据结构、访问效率和操作性能上。 1. 数据结构: - ArrayList 实现了一个动态数组,它内部是一个 Object...

    ArrayList LinkedList Vector性能对比

    ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...

    源码解析jdk7.0集合:LinkedList的底层实现原理.pdf

    在深入分析JDK 7.0中LinkedList集合的底层实现原理前,我们首先需要了解LinkedList的基本概念。LinkedList,即双向链表,是一种通过双向指针相互连接的数据结构,每个节点包含数据域以及指向前驱和后继节点的指针。...

    JavaScript 实现基础 LinkedList 功能

    JavaScript中的LinkedList是一种常见的数据结构,它允许我们在列表的任意位置高效地添加和删除元素。在JavaScript中实现LinkedList,我们需要理解其基本概念、操作以及如何用原生JavaScript对象来模拟链表结构。 ...

    用LinkedList实现队列和栈

    在Java编程语言中,`LinkedList` 是一个常用的集合类,它实现了`List`接口,并且提供了额外的功能,如双端操作。本篇文章将探讨如何利用`LinkedList`来实现队列和栈这两种数据结构,以及其背后的原理和源码分析。 #...

    关于arraylist和linkedList的区别

    ### 关于ArrayList与LinkedList的区别 在Java编程语言中,`ArrayList`与`LinkedList`都是`List`接口的具体实现类,用于存储元素集合。虽然它们都实现了同样的接口并且提供了相同的基本功能,但在内部实现机制、性能...

Global site tag (gtag.js) - Google Analytics