链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址。链表可分为单向链表和双向链表。

一个单向链表包括两个值: 当前节点的值和一个指向下一个节点的链接。

Java的LinkedList

一个双向链表有三个整数值: 数值、向后的节点链接、向前的节点链接。

Java的LinkedList

Java的LinkedList(链表) 类似于 ArrayList,是一种常用的数据容器。与 ArrayList 相比,LinkedList 的增加和删去的操作功率更高,而查找和修改的操作功率较低

以下状况运用 ArrayList:

  • 频频访问列表中的某一个元素。
  • 只需要在列表结尾进行增加和删去元素操作。

以下状况运用 LinkedList :

  • 你需要经过循环迭代来访问列表中的某些元素。
  • 需要频频的在列表最初、中心、结尾等方位进行增加和删去元素操作。

LinkedList 继承了 AbstractSequentialList 类。分别完成了 Queue 接口,可作为行列运用; List 接口,可进行列表的相关操作; Deque 接口,可作为行列运用; Cloneable 接口,可完成克隆; java.io.Serializable 接口,即可支撑序列化,能经过序列化去传输。

Java的LinkedList

LinkedList 类坐落 java.util 包中,运用前需要引进它,语法格局如下:

// 引进 LinkedList 类
import java.util.LinkedList; 
LinkedList<E> list = new LinkedList<E>();   // 一般创立办法
或许
LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 运用调集创立链表

创立一个简略的链表实例:

import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        System.out.println(sites);
    }
}
// 实例履行输出成果为:
// [Google, Runoob, Taobao, Weibo]

更多的状况下我们运用 ArrayList 访问列表中的随机元素愈加高效,但以下几种状况 LinkedList 提供了更高效的办法

在列表最初增加元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        // 运用 addFirst() 在头部增加元素
        sites.addFirst("Wiki");
        System.out.println(sites);
    }
}
// 实例履行输出成果为:
// [Wiki, Google, Runoob, Taobao]

在列表结尾增加元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        // 运用 addLast() 在尾部增加元素
        sites.addLast("Wiki");
        System.out.println(sites);
    }
}
// 实例履行输出成果为:
// [Google, Runoob, Taobao, Wiki]

在列表最初移除元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 运用 removeFirst() 移除头部元素
        sites.removeFirst();
        System.out.println(sites);
    }
}
// 实例履行输出成果为:
// [Runoob, Taobao, Weibo]

在列表结尾移除元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 运用 removeLast() 移除尾部元素
        sites.removeLast();
        System.out.println(sites);
    }
}
// 实例履行输出成果为:
// [Google, Runoob, Taobao]

获取列表最初的元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 运用 getFirst() 获取头部元素
        System.out.println(sites.getFirst());
    }
}
// 实例履行输出成果为:
// Google

获取列表结尾的元素

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        // 运用 getLast() 获取尾部元素
        System.out.println(sites.getLast());
    }
}
// 实例履行输出成果为:
// Weibo

LinkedList 迭代元素方法

能够运用 for 合作 size() 办法来迭代列表中的元素:

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        for (int size = sites.size(), i = 0; i < size; i++) {
            System.out.println(sites.get(i));
        }
    }
}
// 实例履行输出成果为:
// Google
// Runoob
// Taobao
// Weibo

也能够运用 for-each 来迭代元素:

// 引进 LinkedList 类
import java.util.LinkedList;
public class RunoobTest {
    public static void main(String[] args) {
        LinkedList<String> sites = new LinkedList<String>();
        sites.add("Google");
        sites.add("Runoob");
        sites.add("Taobao");
        sites.add("Weibo");
        for (String i : sites) {
            System.out.println(i);
        }
    }
}
// 实例履行输出成果为:
// Google
// Runoob
// Taobao
// Weibo

LinkedList 常用办法

办法 描述
public boolean add(E e) 链表结尾增加元素,回来是否成功,成功为 true,失利为 false
public void add(int index, E element) 向指定方位刺进元素
public boolean addAll(Collection c) 将一个调集的一切元素增加到链表后边,回来是否成功,成功为 true,失利为 false
public boolean addAll(int index, Collection c) 将一个调集的一切元素增加到链表的指定方位后边,回来是否成功,成功为 true,失利为 false
public void addFirst(E e) 元素增加到头部
public void addLast(E e) 元素增加到尾部
public boolean offer(E e) 向链表结尾增加元素,回来是否成功,成功为 true,失利为 false
public boolean offerFirst(E e) 头部刺进元素,回来是否成功,成功为 true,失利为 false
public boolean offerLast(E e) 尾部刺进元素,回来是否成功,成功为 true,失利为 false
public void clear() 清空链表
public E removeFirst() 删去并回来第一个元素
public E removeLast() 删去并回来最后一个元素
public boolean remove(Object o) 删去某一元素,回来是否成功,成功为 true,失利为 false
public E remove(int index) 删去指定方位的元素
public E poll() 删去并回来第一个元素
public E remove() 删去并回来第一个元素
public boolean contains(Object o) 判别是否含有某一元素
public E get(int index) 回来指定方位的元素
public E getFirst() 回来第一个元素
public E getLast() 回来最后一个元素
public int indexOf(Object o) 查找指定元素早年往后第一次出现的索引
public int lastIndexOf(Object o) 查找指定元素最后一次出现的索引
public E peek() 回来第一个元素
public E element() 回来第一个元素
public E peekFirst() 回来头部元素
public E peekLast() 回来尾部元素
public E set(int index, E element) 设置指定方位的元素
public Object clone() 克隆该列表
public Iterator descendingIterator() 回来倒序迭代器
public int size() 回来链表元素个数
public ListIterator listIterator(int index) 回来从指定方位开始到结尾的迭代器
public Object[] toArray() 回来一个由链表元素组成的数组
public T[] toArray(T[] a) 回来一个由链表元素转换类型而成的数组