`
hongjn
  • 浏览: 56090 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

JDK源码 LinkedList

阅读更多

1.初始化一个空的节点header:

private transient Entry<E> header = new Entry<E>(null, null, null);
该节点在《算法导论》里应该叫“哨兵节点”。
2.初始化一个空的LinkedList,即设置header节点的前后节点都是空。
    /**
     * Constructs an empty list.
     */
    public LinkedList() {
        header.next = header.previous = header;
    }
3.Entry的构造方法:
private static class Entry<E> {
      E element;
      Entry<E> next;
      Entry<E> previous;

      Entry(E element, Entry<E> next, Entry<E> previous) {
          this.element = element;
          this.next = next;
          this.previous = previous;
      }
    }
包含节点的数据element,指向下一个节点的next,和指向前一个节点的previous.
4.主要的api包含删除元素,添加元素等,有许多重载方法。
1)删除LinkedList中的一个节点对象,主要是从头往后遍历节点,找到即删除之。
关于该删除操作的时间复杂度讨论,引用博文:LinkedList的局限
    public boolean remove(Object o) {
        if (o==null) {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (e.element==null) {
                    remove(e);
                    return true;
                }
            }
        } else {
            for (Entry<E> e = header.next; e != header; e = e.next) {
                if (o.equals(e.element)) {
                    remove(e);
                    return true;
                }
            }
        }
        return false;
    }
2)删除指定位置的节点。
    public E remove(int index) {
        return remove(entry(index));
    }
首先根据索引index去查找节点
    private Entry<E> entry(int index) {
        if (index < 0 || index >= size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Entry<E> e = header;
        if (index < (size >> 1)) {
            for (int i = 0; i <= index; i++)
                e = e.next;
        } else {
            for (int i = size; i > index; i--)
                e = e.previous;
        }
        return e;
    }
这里的技巧是,先判断index在LinkedList中是前半部分还是后半部分,如果前半部分就从头往后遍历,反之从后往前遍历,可以这么做的原因是该LinkedList是双向链表。
接下来的删除节点就比较简单了。
    private E remove(Entry<E> e) {
      if (e == header)
          throw new NoSuchElementException();

        E result = e.element;
      e.previous.next = e.next;
      e.next.previous = e.previous;
        e.next = e.previous = null;
        e.element = null;
      size--;
      modCount++;
        return result;
    }
先保存节点的数据E result = e.element;最后返回。
主要的操作是,让该节点的前一节点指向该节点的后一节点;
让该节点的后一节点的前一节点指向该节点的前一节点;
然后将该节点的前后节点置为空,节点数据也置为空;
链表的节点数减一,链表的修改次数加一。
返回之前保存的节点数据,删除操作结束。
3)在指定的位置index插入一个集合Collection c。
   主要是将集合c转换为数组,遍历数组元素;
   如果正好是在最后的位置(即index==size)插入,那么直接在header前面插入即可,因为LinkedList是一个双向链表。
   否则,那么在指定的index之前插入,然后遍历集合数组,依次在此插入各个元素。
    public boolean addAll(int index, Collection<? extends E> c) {
        if (index < 0 || index > size)
            throw new IndexOutOfBoundsException("Index: "+index+
                                                ", Size: "+size);
        Object[] a = c.toArray();
        int numNew = a.length;
        if (numNew==0)
            return false;
      modCount++;

        Entry<E> successor = (index==size ? header : entry(index));
        Entry<E> predecessor = successor.previous;
      for (int i=0; i<numNew; i++) {
            Entry<E> e = new Entry<E>((E)a[i], successor, predecessor);
            predecessor.next = e;
            predecessor = e;
        }
        successor.previous = predecessor;

        size += numNew;
        return true;
    }
 4)clear()方法,删除所有的节点
遍历该LinkedList,设置每个节点的前后节点及element为null
最后设置header前点的前后节点为null
    public void clear() {
        Entry<E> e = header.next;
        while (e != header) {
            Entry<E> next = e.next;
            e.next = e.previous = null;
            e.element = null;
            e = next;
        }
        header.next = header.previous = header;
        size = 0;
      modCount++;
    }
就列举这么多吧。
1
1
分享到:
评论

相关推荐

    jdk源码 jdk源码

    Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。...通过深入阅读JDK源码,开发者不仅可以增强对Java语言特性的理解,还能提高解决实际问题的能力,这对于成为一名优秀的Java开发者至关重要。

    jdk1.6 源码jdk1.6 源码

    7. **集合框架**:JDK 1.6的`java.util`包包含了各种集合实现,如ArrayList、LinkedList、HashMap等。源码分析可以揭示它们的内部结构和操作算法,这对于理解性能和选择合适的集合类型很有帮助。 8. **网络编程**:...

    JDK源码,整合所有内容

    **JDK源码详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,其中包含了Java运行环境、编译器、类库以及各种工具。JDK1.8版本是Java历史上的一个重要里程碑,引入了许多...

    JDK源码选读

    《JDK源码选读》是一本专注于Java开发人员深入理解JDK内核的重要参考资料。通过对JDK源码的解析,读者可以了解到Java语言的核心机制,提升编程技能和解决问题的能力。这里我们将围绕JDK源码中的关键知识点进行深入...

    java源码之jdk源码

    Java源码是深入理解Java平台工作原理的关键,JDK源码包含了Java开发工具集的核心实现。通过对JDK源码的学习,开发者可以了解到Java语言的底层机制,提升编程技能,更好地解决实际问题。以下将详细探讨Java源代码和...

    jdk1.6源码

    《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。JDK1.6作为历史版本,虽然已被更新的JDK版本所替代,但它仍然具有重要的学习价值,尤其对于...

    jdk1.8 sun源码

    这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...

    设计模式实战、jdk源码|simple-demo.zip

    本资源主要围绕“设计模式实战”与“JDK源码解读”展开,帮助我们深入理解并运用设计模式,提升代码质量与可维护性。 首先,我们要明白设计模式的分类。设计模式分为三大类:创建型模式(如单例模式、工厂方法模式...

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

    接下来,我们将通过JDK 7.0的源码,深入探讨LinkedList的底层实现原理。 首先,LinkedList实现了List接口,因此它是一个有序列表。它还实现了Deque接口,这意味着LinkedList支持双端队列的操作。除了这些接口之外,...

    javajdk源码学习-JavaSourceLearn:JDK源码学习

    jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...

    javajdk源码学习-JavaSourceLearn:jdk源码学习

    在Java编程领域,深入理解JDK源码是提升技能的关键步骤。"JavaSourceLearn"项目致力于帮助开发者探索和学习JDK的源代码,这将使我们能够更好地理解Java语言的工作原理,提高问题解决能力,以及优化代码性能。下面,...

    系统解析JDK源码,领略大牛设计思想,JAVA进阶必备(2023新课,已完结)

    在Java编程领域,深入理解JDK源码是提升技能、进阶高级开发者的必经之路。"系统解析JDK源码,领略大牛设计思想,JAVA进阶必备"这一课程或资源包,旨在帮助开发者通过分析JDK源码,学习并掌握其中蕴含的设计模式和...

    jdk:jdk源码阅读

    【标题】:深入理解JDK源码 在Java开发领域,深入阅读JDK源码是提升技术水平的重要途径。JDK,即Java Development Kit,是Oracle公司提供的Java开发工具集,包含了Java运行环境、编译器、类库以及各种工具。通过...

    JDK1.6中Arraylist,Vector,LinkedList源码

    在JDK 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...

    java-jdk源码学习

    Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、...

    java jdk 实例宝典源码

    下面,我们将详细探讨Java JDK源码中的关键知识点。 1. **基础类库**: - **Object类**:所有Java类的根类,包含了如`equals()`、`hashCode()`、`toString()`等基础方法。 - **String类**:Java中不可变的字符...

    jdk src 源码 压缩包提取

    Java JDK源码是Java开发人员深入理解平台内部工作原理的重要资源。这个压缩包包含了JDK的源代码,供开发者学习和研究。通过下载并解压缩这个文件,你可以直接查看到Java标准库的各种类和方法的实现细节。 源码分析...

    Jdk1.6 Collections Framework源码解析(2)-LinkedList

    《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...

    javajdk源码-java.util_source_learning:学习JDK源代码

    在JDK源码中,`java.util`包涵盖了许多关键类和接口,如ArrayList、LinkedList、HashMap、HashSet、Queue、Comparator等。这些类和接口构成了Java的核心数据结构和算法基础。例如: 1. **ArrayList**: 是一个基于...

    关于 ArrayList get(0)的异常JDK源码跟进

    这篇博客主要探讨了当尝试通过`get(0)`获取ArrayList的第一个元素时可能出现的问题,并通过JDK源码分析了其原因。 首先,我们需要了解ArrayList的内部结构。ArrayList实际上是一个基于数组实现的列表,它维护了一个...

Global site tag (gtag.js) - Google Analytics