`
DiaoCow
  • 浏览: 244193 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

初窥LinkedList

    博客分类:
  • Java
 
阅读更多
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
分享到:
评论

相关推荐

    使用LinkedList模拟堆栈

    本文将详细讲解如何使用Java中的LinkedList类来模拟这两种数据结构,并实现其基本操作。 堆栈(Stack)是一种后进先出(LIFO, Last In First Out)的数据结构,它遵循“先进后出”的原则。常见的堆栈操作有压栈...

    List-LinkedList 单链表就地反转

    ### List-LinkedList 单链表就地反转 #### 概述 本文主要介绍单链表的就地反转算法实现,并通过具体的C语言代码示例来解释这一过程。单链表是一种常见的线性数据结构,其中每个元素包含一个指向下一个元素的指针。...

    JAVA利用LinkedList构造栈与队列

    在Java编程语言中,LinkedList是一个常用的集合类,它实现了List接口,同时也提供了双向链表的实现。LinkedList不仅可以作为列表使用,还可以被巧妙地利用来构建栈(Stack)和队列(Queue)这两种基本数据结构。在本...

    ArrayList LinkedList Vector区别

    ArrayList LinkedList Vector 区别 ArrayList、LinkedList、Vector 是 Java 中常用的数据结构实现类,它们都实现了 List 接口,但它们在存储方式、性能、线程安全性等方面有着不同特点。 首先,ArrayList 和 ...

    创建一个 LinkedList项目.docx

    LinkedList 是 Java 中的一种数据结构,属于线性数据结构的一种,但它与数组有着本质的不同。数组在内存中存储元素是连续的,而 LinkedList 则通过节点之间的引用相互连接,每个节点包含元素本身、指向前一个节点的...

    java中LinkedList任意排序实例

    在Java编程中,LinkedList是一个非常重要的数据结构,它实现了List接口,允许我们在列表的任何位置进行插入和删除操作。LinkedList内部使用双向链表实现,因此它的遍历速度比ArrayList快,但随机访问性能较差。本...

    LinkedList实践代码

    LinkedList是Java编程语言中的一种重要数据结构,它属于集合框架的一部分,主要用来存储有序的元素序列。LinkedList在实现上是一个双链表,每个节点(Node)包含数据元素和两个引用,一个指向前一个节点,另一个指向...

    LinkedLIst.cpp

    LinkedLIst.cpp

    Java LinkedList Source Code

    非常简单的Java LinkedList 应用实例

    LinkedList的实现.zip

    LinkedList是计算机科学中的一种基本数据结构,特别是在C++编程中,它被广泛用于处理动态集合。LinkedList的主要特点是每个元素(称为节点)包含数据以及指向下一个节点的指针,这种结构使得在列表中间添加或删除...

    ArrayList和Linkedlist1

    在IT领域,特别是Java编程中,ArrayList和LinkedList是两种非常重要的数据结构,它们都是List接口的实现类。理解这两者的区别对于优化程序性能至关重要。面试官询问这些知识点,旨在评估应聘者的理论基础和实践能力...

    ArrayList LinkedList Vector性能测试

    在Java编程语言中,ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们都在java.util包中,用于存储和管理对象的集合。这三个类都实现了List接口,提供了多种操作方法,但它们在内部实现和性能特性上有所...

    Java 中Linkedlist类的源代码

    在Java编程语言中,LinkedList是一个实现List接口的类,它以双向链表的形式存储元素。这个数据结构允许我们在列表的任何位置进行插入和删除操作,具有O(1)的时间复杂度,这使得LinkedList在需要频繁进行这些操作时比...

    Arduino-LinkedList.zip

    Arduino-LinkedList.zip,与通用微控制器和Arduino ProjectsLinkedList一起工作的完全实现的LinkedList,Arduino是一家开源软硬件公司和制造商社区。Arduino始于21世纪初,深受电子制造商的欢迎,Arduino通过开源系统...

    java LinkedList的添加删除操作

    在Java编程语言中,LinkedList是一种线性数据结构,属于集合框架的一部分,实现了List接口和Deque接口。LinkedList以链表的形式存储元素,这使得它在添加和删除元素时具有较高的效率,尤其是在列表的中间或开头进行...

    LinkedList 部分源码

    ### LinkedList部分源码解析 #### 一、简介 `LinkedList`是Java集合框架的一个重要组成部分,它基于双向链表实现,既支持`List`接口也实现了`Deque`接口,因此可以作为列表、栈或者队列使用。双向链表的每个节点...

    LinkedList的用法

    ### LinkedList的用法详解 #### 一、简介 在Java集合框架中,`LinkedList`类是一种基于链表实现的线性数据结构,继承自`AbstractSequentialList`抽象类,并实现了`List`接口与`Deque`接口。由于其内部是通过双向...

    比较ArrayList、LinkedList、Vector1

    【ArrayList、LinkedList、Vector对比分析】 1. **List概述** List接口是Java集合框架中的重要组成部分,它是一个有序的集合,允许重复元素,并且保持插入顺序。List接口的实现类主要有ArrayList、LinkedList和...

    ArrayList LinkedList Vector性能对比

    ArrayList、LinkedList和Vector是三种常见的动态数组实现,它们各自有特定的特性和使用场景。这里我们将深入探讨这三个类的性能对比,以及它们在不同操作下的表现。 ArrayList是基于动态数组实现的,它提供了随机...

Global site tag (gtag.js) - Google Analytics