1.LinkeList概述:
// LinkedList内部维护着一个双向循环链表,它保存着头指针引用
private transient Entry<E> header = new Entry<E>(null, null, null);
其中Entry是LinkedList的内部类,代表着链表上的一个节点元素:
private static class Entry<E> {
E element; // 节点元素value
Entry<E> next; // 指向下一个节点
Entry<E> previous; // 指向上一个节点
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
2.LinkedList构造方法:
public LinkedList() {
// 创建一个只包含头指针的循环链表(如下图显示)
header.next = header.previous = header;
}
3.LinkedList中get类方法:
public E getFirst() {
if (size==0)
throw new NoSuchElementException();
return header.next.element; // 获取头指针指向的下一个元素,即首元素
}
public E getLast() {
if (size==0)
throw new NoSuchElementException();
return header.previous.element; // 获取头指针指向的上一个元素,即末尾元素
}
可以参看下图(getFirst方法返回e1元素,getLast方法返回e2元素):
4.LinkedList中add类方法:
// 熟悉双向循环链表的朋友都知道,插入一个节点需要修改4个指针)
public void addFirst(E e) {
addBefore(e, header.next);
}
public void addLast(E e) {
addBefore(e, header);
}
public boolean add(E e) {
addBefore(e, header);
return true;
}
public void add(int index, E element) {
addBefore(element, (index==size ? header : entry(index)));
}
// 往entry节点前新增一个节点
private Entry<E> addBefore(E e, Entry<E> entry) {
// 创建newEntry节点,初始化其next指针指向entry,previous指向entry节点原先的上一个节点(如下图标记1,2)
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry; // 修正指针标记4
newEntry.next.previous = newEntry; // 修正指针标记3
size++;
modCount++;
return newEntry;
}
5.LinkedList中remove类方法:
public E remove(int index) {
return remove(entry(index));
}
public E removeFirst() {
return remove(header.next);
}
public E removeLast() {
return remove(header.previous);
}
private E remove(Entry<E> e) {
if (e == header)
throw new NoSuchElementException();
E result = e.element;
// 删除节点e
e.previous.next = e.next;
e.next.previous = e.previous;
// 将节点e的所有引用设置为null,gc回收
e.next = e.previous = null;
e.element = null;
size--;
modCount++;
return result;
}
6.LinkedList中的优化:
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;
}
当在链表中查找第i个元素时,不是直接从第一个元素开始遍历,而是先会做个预判断,若i的值小于n/2 则从前往后找,否则从后往前查找
- 大小: 7.9 KB
- 大小: 27.3 KB
- 大小: 50.5 KB
分享到:
相关推荐
本文将详细讲解如何使用Java中的LinkedList类来模拟这两种数据结构,并实现其基本操作。 堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它遵循“先进后出”的原则。常见的堆栈操作有压栈...
### List-LinkedList 单链表就地反转 #### 概述 本文主要介绍单链表的就地反转算法实现,并通过具体的C语言代码示例来解释这一过程。单链表是一种常见的线性数据结构,其中每个元素包含一个指向下一个元素的指针。...
在Java编程语言中,LinkedList是一个常用的集合类,它实现了List接口,同时也提供了双向链表的实现。LinkedList不仅可以作为列表使用,还可以被巧妙地利用来构建栈(Stack)和队列(Queue)这两种基本数据结构。在本...
ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...
LinkedList 是 Java 中的一种数据结构,属于线性数据结构的一种,但它与数组有着本质的不同。数组在内存中存储元素是连续的,而 LinkedList 则通过节点之间的引用相互连接,每个节点包含元素本身、指向前一个节点的...
在Java编程中,LinkedList是一个非常重要的数据结构,它实现了List接口,允许我们在列表的任何位置进行插入和删除操作。LinkedList内部使用双向链表实现,因此它的遍历速度比ArrayList快,但随机访问性能较差。本...
LinkedList是Java编程语言中的一种重要数据结构,它属于集合框架的一部分,主要用来存储有序的元素序列。LinkedList在实现上是一个双链表,每个节点(Node)包含数据元素和两个引用,一个指向前一个节点,另一个指向...
LinkedLIst.cpp
非常简单的Java LinkedList 应用实例
LinkedList是计算机科学中的一种基本数据结构,特别是在C++编程中,它被广泛用于处理动态集合。LinkedList的主要特点是每个元素(称为节点)包含数据以及指向下一个节点的指针,这种结构使得在列表中间添加或删除...
在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能至关重要。面试官询问这些知识点,旨在评估应聘者的理论基础和实践能力...
在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...
在Java编程语言中,LinkedList是一个实现List接口的类,它以双向链表的形式存储元素。这个数据结构允许我们在列表的任何位置进行插入和删除操作,具有O(1)的时间复杂度,这使得LinkedList在需要频繁进行这些操作时比...
Arduino-LinkedList.zip,与通用微控制器和Arduino ProjectsLinkedList一起工作的完全实现的LinkedList,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统...
在Java编程语言中,LinkedList是一种线性数据结构,属于集合框架的一部分,实现了List接口和Deque接口。LinkedList以链表的形式存储元素,这使得它在添加和删除元素时具有较高的效率,尤其是在列表的中间或开头进行...
### LinkedList部分源码解析 #### 一、简介 `LinkedList`是Java集合框架的一个重要组成部分,它基于双向链表实现,既支持`List`接口也实现了`Deque`接口,因此可以作为列表、栈或者队列使用。双向链表的每个节点...
### LinkedList的用法详解 #### 一、简介 在Java集合框架中,`LinkedList`类是一种基于链表实现的线性数据结构,继承自`AbstractSequentialList`抽象类,并实现了`List`接口与`Deque`接口。由于其内部是通过双向...
【ArrayList、LinkedList、Vector对比分析】 1. **List概述** List接口是Java集合框架中的重要组成部分,它是一个有序的集合,允许重复元素,并且保持插入顺序。List接口的实现类主要有ArrayList、LinkedList和...
ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...