博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 的 LinkedList 的底层数据结构
阅读量:6259 次
发布时间:2019-06-22

本文共 2847 字,大约阅读时间需要 9 分钟。

1. 数据结构--LinkedList源码摘要

public class LinkedList
extends AbstractSequentialList
implements List
, Deque
, Cloneable, java.io.Serializable{ transient int size = 0; /** * Pointer to first node. * Invariant: (first == null && last == null) || * (first.prev == null && first.item != null) */ transient Node
first; /** * Pointer to last node. * Invariant: (first == null && last == null) || * (last.next == null && last.item != null) */ transient Node
last;}

LinkedList底层最重要的三个属性,size,first,last,可以看出,LinkedList是一个双向链表的数据结构。

private static class Node
{ E item; Node
next; Node
prev; Node(Node
prev, E element, Node
next) { this.item = element; this.next = next; this.prev = prev; } }
Node节点包含 item元素、prev上一个节点和next下一个节点的引用。 2 LinkedList的底层数据的调整 add方法
/**     * Appends the specified element to the end of this list.     *     * 

This method is equivalent to {

@link #addLast}. * * @param e element to be appended to this list * @return {
@code true} (as specified by {
@link Collection#add}) */ public boolean add(E e) { linkLast(e); return true; }

/**

 

     * Links e as last element.

 

     */

 

    void linkLast(E e) {

 

        final Node<E> l = last;

 

        final Node<E> newNode = new Node<>(l, e, null);

 

        last = newNode;

 

        if (l == null)

 

            first = newNode;

 

        else

 

            l.next = newNode;

 

        size++;

 

        modCount++;

 

    }

 

从源码中可以看出,在add方法中直接调用linkLast方法,该方法1.实例化一个node节点,追加到链表的末尾,2调整上一个

节点的下一个节点应用为新增节点。3修改last为新增的node节点。由此可以看出LinkedList的新增和删除操作效率明显。

get方法

 

/**     * Returns the element at the specified position in this list.     *     * @param index index of the element to return     * @return the element at the specified position in this list     * @throws IndexOutOfBoundsException {
@inheritDoc} */ public E get(int index) { checkElementIndex(index); return node(index).item; } /** * Returns the (non-null) Node at the specified element index. */ Node
node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node
x = first; for (int i = 0; i < index; i++) x = x.next; return x; } else { Node
x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }

 

 

 

get方法中首先检查索引是否越界(return index >= 0 && index <= size;),第二部根据二分法判断索引是否大于size的一半,如果大于则从后往前检索,小于则从前往后检索。

 

转载于:https://www.cnblogs.com/dassmeta/p/5338801.html

你可能感兴趣的文章
nginx编译安装和一键安装脚本
查看>>
保护数组内容、复合文字
查看>>
git回到上一版本命令
查看>>
CString 成员函数用法大全(转)
查看>>
php遍历递归遍历目录及文件
查看>>
join的实现原理及优化
查看>>
alias永久生效
查看>>
深入理解Linux的性能(一)[转]
查看>>
我的友情链接
查看>>
10个经典的Android开源项目(附源码包)
查看>>
微信如何收发企业邮箱邮件
查看>>
java破解ip屏蔽+多线程同步拨号-【多线程数据采集之五】
查看>>
分布式唯一ID生成器Twitter 的 Snowflake idworker java版本
查看>>
思科6509端口限速
查看>>
一场盗号引发的诗歌大赛
查看>>
基于UDP协议的socket通信
查看>>
SQL Server 行列转换
查看>>
对php代码混淆的研究
查看>>
OpenFlow协议标准演进过程
查看>>
Gartner:关于SDN的七类常见误解
查看>>