LinkedList_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > LinkedList

LinkedList

 2018/3/18 0:47:32  chen.zhu  程序员俱乐部  我要评论(0)
  • 摘要:LinkedListLinkedList源码解析转载自:https://www.cnblogs.com/CherishFX/p/4734490.html线性表介绍转载自:https://www.jianshu.com/p/02f8696bf4cf总结:LinkedList是基于双向链表实现的。其中的元素不存在下标索引,因此不适合于查找,但适合于添加(add)和删除(remove)。LinkedList进行插入和删除时,只需修改相邻元素的next和previous的引用即可
  • 标签:list
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节点的。具体实现为:
class="java"> //返回指定索引位置的节点
    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:对于新增和caozuo.html" target="_blank">删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,调用System.arrayCopy( ),比较消耗资源。
上一篇: PHP解析URL的3种方法 下一篇: 没有下一篇了!
发表评论
用户名: 匿名