LinkedList

本贴最后更新于 2350 天前,其中的信息可能已经时过境迁

java.util.LinkedList

一、特点
1、允许元素为空;
2、允许元素重复;
3、元素有序;
4、非线程安全。

二、源码

public class LinkedList<E> extends AbstractSequantialList<E> implements List<E>, Deque<E>, cloneable, java.io.Serializable {
 
 /*
  * *************************节点**************************************
  */
 private static class Node<E> {
   E item;
   Node<E> prev;
   Node<E> next;
   
   Node(Node<E> prev, E element, Node<E> next) {
	 this.prev = prev;
	 this.item = element;
	 this.next = next;
   }
 }
 
 /*
  * *************************字段**************************************
  */
 transient int size;
 transient Node<E> first;
 transient Node<E> last;
 
 /*
  * *************************构造器************************************
  */
 public LinkedList() {}
 
 public LinkedList(Collection<? extends E> c) {
   this();
   addAll(c);
 }
 
 /*
  * **************************增**************************************
  */
  
  // *******************实现List接口的方法******************************
  
  // 在链表尾部添加一个元素
  public boolean add(E e) {
	linkLast(e);
	return true;
  }
  
  void llinkLast(E e) {
	Node<E> l = last;
	Node<E> newNode = new Node(l, e, null);
	
	last = newNode;
	if (l == null) {
	  first = newNode;
	} else {
	  l.next = newNode;
	}
	size++;
	modCount++;
  }
  
  // 在指定的位置插入一个元素
  public void add(int index, E e) {
	checkPositionIndex(index); // 范围是 0-size,如果是size相当于在尾部添加元素
	
	if (index == size) {
	  linkLast(e);
	} else {
	  linkBefore(e, node(index));
	}
  }
  
  void linkBefore(E e, Node<E> succ) {
	final Node<E> prev = succ.prev;
	final Node<E> newNode = new Node(prev, e, succ);
	
	succ.prev = newNode;
	if (prev == null) {
	  first = newNode; // !!!
	} else {
	  prev.next = newNode;
	}
	size++;
	modCount++;
  }
  
  // 在链表尾部添加一个集合
  public boolean addAll(Collection<? extends E> c) {
	return addAll(size, c);
  }
  
  // 在指定的位置插入一个集合
  public boolean addAll(int index, Collection<? extends E>) {
	checkPositionIndex(index);
	
	Object[] a = c.toArray();
	int numNew = a.length;
	if (length == 0) {
	  return false;
	}
	
	Node<E> pred;
	Node<E> succ;
	if (index == size) {
	  pred = last;
	  succ = null;
	} else {
	  succ = node(index);
	  pred = succ.prev;
	}
	
	for (Object o : a) {
	  @SuppressWarnings("unchecked")
	  E e = (E) o;
	  Node<E> newNode = new Node(pred, e, null);
	  
	  if (pred == null) {
		first = newNode;
	  } else {
		pred.next = newNode;
	  }
	  pred = newNode;
	}
	
	if (succ == null) {
	  last = pred;
	} else {
	  pred.next = succ;
	  succ.prev = pred;
	}
	
	size += numNew;
	modCount++;
	return true;
  }
  
  // *******************实现Deque接口的方法******************************
  
  // 在链表头部插入一个元素
  public  void  addFirst(E e)
  
  // 在链表尾部添加一个元素
  public  void  addLast(E e)
  
  // 在链表尾部添加一个元素(返回的是boolean)
  public  boolean  offer(E e)
  
  // 在链表头部插入一个元素(返回的是boolean)
  public  boolean  offerFirst(E e)
  
  // 在链表尾部添加一个元素(返回的是boolean)
  public boolean offerLast(E e)
  
  /*
   * **************************删**************************************
   */
  
  
  /*
   * **************************查**************************************
   */
   
   // 获取指定位置元素
   public E get(int index) {
	 checkElementIndex(index);
	 return node(index).item;
   }
  
  
  /*
   * **************************改**************************************
   */
  
  /*
   * ************************辅助方法************************************
   */
   
   // 检查下标是否越界
   private void checkPositionIndex(int index) {
	 if (!isPositionIndex(index)) {
	   throw new IndexOutOfBoundsException(OutOfBoundsMsg(index));
	 }
   }
   
   // 检查下标是否存在
   
   
   // 获取指定下标的节点
   Node<E> node(int index) {
	if (index < (size >> 1)) {
	  Node<E> x = first;
	  for (int i = 0; i < index; i++) {
		x = x.next;
	  }
	} else {
	  Node<E> x = last;
	  for (int i = size - 1; i > index; i--) {
		x = x.prev;
	  }
	}
  }
  
  /*
   * ************************迭代器************************************
   */
 
}

LinkedList 不是线程安全的,如果想使 LinkedList 变成线程安全的,可以使用如下方式:

List list=Collections.synchronizedList(new LinkedList(...));

参考:
LinkedList 源码
http://www.importnew.com/25023.html
http://blog.csdn.net/qq_19431333/article/details/54572876

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖
  • list
    10 引用 • 15 回帖

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    6518 引用 • 29299 回帖 • 248 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 455 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 17 关注
  • 创业

    你比 99% 的人都优秀么?

    82 引用 • 1398 回帖 • 2 关注
  • 996
    13 引用 • 200 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 132 关注
  • danl
    61 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖 • 1 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 1 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 621 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 126 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 70 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 4 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    82 引用 • 122 回帖 • 614 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 228 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 8 关注
  • WordPress

    WordPress 是一个使用 PHP 语言开发的博客平台,用户可以在支持 PHP 和 MySQL 数据库的服务器上架设自己的博客。也可以把 WordPress 当作一个内容管理系统(CMS)来使用。WordPress 是一个免费的开源项目,在 GNU 通用公共许可证(GPLv2)下授权发布。

    45 引用 • 113 回帖 • 317 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 53 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 47 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    25 引用 • 215 回帖 • 163 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 3 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    138 引用 • 268 回帖 • 199 关注
  • Caddy

    Caddy 是一款默认自动启用 HTTPS 的 HTTP/2 Web 服务器。

    10 引用 • 54 回帖 • 131 关注