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中的一个节点对象,主要是从头往后遍历节点,找到即删除之。
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++;
}
就列举这么多吧。
分享到:
相关推荐
Java Development Kit (JDK) 源码是学习和理解Java平台核心机制的关键资源。...通过深入阅读JDK源码,开发者不仅可以增强对Java语言特性的理解,还能提高解决实际问题的能力,这对于成为一名优秀的Java开发者至关重要。
**JDK源码详解** JDK(Java Development Kit)是Oracle公司发布的用于开发Java应用程序的软件开发工具包,其中包含了Java运行环境、编译器、类库以及各种工具。JDK1.8版本是Java历史上的一个重要里程碑,引入了许多...
《JDK源码选读》是一本专注于Java开发人员深入理解JDK内核的重要参考资料。通过对JDK源码的解析,读者可以了解到Java语言的核心机制,提升编程技能和解决问题的能力。这里我们将围绕JDK源码中的关键知识点进行深入...
7. **集合框架**:JDK 1.6的`java.util`包包含了各种集合实现,如ArrayList、LinkedList、HashMap等。源码分析可以揭示它们的内部结构和操作算法,这对于理解性能和选择合适的集合类型很有帮助。 8. **网络编程**:...
Java源码是深入理解Java平台工作原理的关键,JDK源码包含了Java开发工具集的核心实现。通过对JDK源码的学习,开发者可以了解到Java语言的底层机制,提升编程技能,更好地解决实际问题。以下将详细探讨Java源代码和...
《深入解析JDK1.6源码》 JDK(Java Development Kit)是Java开发工具集,其中包含了Java运行环境、编译器以及各种API。JDK1.6作为历史版本,虽然已被更新的JDK版本所替代,但它仍然具有重要的学习价值,尤其对于...
这个"jdk1.8 sun源码"压缩包很可能包含了这些未公开的Sun Microsystems的源代码,使得开发者有机会深入研究Java平台的内部工作原理,这对于进行底层优化、理解和调试Java程序有着极大的帮助。然而,值得注意的是,...
本资源主要围绕“设计模式实战”与“JDK源码解读”展开,帮助我们深入理解并运用设计模式,提升代码质量与可维护性。 首先,我们要明白设计模式的分类。设计模式分为三大类:创建型模式(如单例模式、工厂方法模式...
接下来,我们将通过JDK 7.0的源码,深入探讨LinkedList的底层实现原理。 首先,LinkedList实现了List接口,因此它是一个有序列表。它还实现了Deque接口,这意味着LinkedList支持双端队列的操作。除了这些接口之外,...
jdk源码学习 JavaSourceLearn 版本号 版本 corretto-1.8.0_275 方式 逐步阅读源码添加注释、notes文件夹添加笔记 计划学习任务计划 标题为包名,后面序号为优先级1-4,优先级递减 java.lang Object 1 String 1 ...
在Java编程领域,深入理解JDK源码是提升技能的关键步骤。"JavaSourceLearn"项目致力于帮助开发者探索和学习JDK的源代码,这将使我们能够更好地理解Java语言的工作原理,提高问题解决能力,以及优化代码性能。下面,...
在Java编程领域,深入理解JDK源码是提升技能、进阶高级开发者的必经之路。"系统解析JDK源码,领略大牛设计思想,JAVA进阶必备"这一课程或资源包,旨在帮助开发者通过分析JDK源码,学习并掌握其中蕴含的设计模式和...
【标题】:深入理解JDK源码 在Java开发领域,深入阅读JDK源码是提升技术水平的重要途径。JDK,即Java Development Kit,是Oracle公司提供的Java开发工具集,包含了Java运行环境、编译器、类库以及各种工具。通过...
在JDK 1.6中,ArrayList提供了线程不安全的高效操作,适合于非并发环境下的高性能读写操作。其优点在于随机访问快速,因为数组支持索引直接访问;缺点是插入和删除元素需要移动后续元素,效率较低。 Vector与...
Java JDK源码学习是深入理解Java编程语言的关键步骤,它能帮助开发者洞悉语言底层的工作原理,提升编程技能和优化代码的能力。JDK(Java Development Kit)是Java开发的核心工具集,包含了Java运行时环境(JRE)、...
下面,我们将详细探讨Java JDK源码中的关键知识点。 1. **基础类库**: - **Object类**:所有Java类的根类,包含了如`equals()`、`hashCode()`、`toString()`等基础方法。 - **String类**:Java中不可变的字符...
Java JDK源码是Java开发人员深入理解平台内部工作原理的重要资源。这个压缩包包含了JDK的源代码,供开发者学习和研究。通过下载并解压缩这个文件,你可以直接查看到Java标准库的各种类和方法的实现细节。 源码分析...
2. **集合框架**:`java.util`包中的`ArrayList`、`LinkedList`、`HashMap`、`HashSet`等数据结构的实现,这些是日常编程中最常用的工具。源码可以帮助理解它们的性能特性,比如插入、删除、查找的时间复杂度。 3. ...
《Jdk1.6 Collections Framework源码解析(2)-LinkedList》 LinkedList是Java集合框架中的一个重要的类,它是List接口的实现,同时继承了AbstractSequentialList,并实现了Deque接口。LinkedList是一种双链表结构,...
在JDK源码中,`java.util`包涵盖了许多关键类和接口,如ArrayList、LinkedList、HashMap、HashSet、Queue、Comparator等。这些类和接口构成了Java的核心数据结构和算法基础。例如: 1. **ArrayList**: 是一个基于...