JAVA LinkedList

概述

集合java.util.LinkedList存储的结构是 链表 结构。

特点: 插入 和 移除 元素比较快

常用方法

实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可:

  • public void addFirst(E e):将指定元素插入此列表的开头。
  • public void addLast(E e):将指定元素添加到此列表的结尾。
  • public E getFirst():返回此列表的第一个元素。
  • public E getLast():返回此列表的最后一个元素。
  • public E removeFirst():移除并返回此列表的第一个元素。
  • public E removeLast():移除并返回此列表的最后一个元素。
  • public E pop():从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e):将元素推入此列表所表示的堆栈。
  • public boolean isEmpty():如果列表不包含元素,则返回true。

LinkedList实现了 List接口,List中的方法LinkedList都可以使用,这里就不做详细介绍

例子:

public class LinkedListDemo {
    public static void main(String[] args) {
        LinkedList<String> link = new LinkedList<String>();
        //添加元素
        link.addFirst("abc1");
        link.addFirst("abc2");
        link.addFirst("abc3");
        System.out.println(link);
        // 获取元素
        System.out.println(link.getFirst());
        System.out.println(link.getLast());
        // 删除元素
        System.out.println(link.removeFirst());
        System.out.println(link.removeLast());

        while (!link.isEmpty()) { //判断集合是否为空
            System.out.println(link.pop()); //弹出集合中的栈顶元素
        }

        System.out.println(link);
    }
}

实现原理

在早期的 java 版本中LinkedList用的是双向链表

public class MyLinkedList {
    // 集合中元素的真实数量
    private int size;
    private Node first;
    private Node last;
    /**
     * 新增
     *  1、如果是第一次添加元素,那么first是null的,所以要创建以Node赋值给first,此时链表中只有一个元素,那么最后一个元素last和first就是同一个对象
     *  2、从第二次开始添加元素时,只需要创建一个新的Node,让它的上一个指针指向last,last的下一个指针指向Node
     *  3、新增的元素一定是最后一个元素,所有给last赋值成最后一个元素
     *  4、size++
     * @param obj
     *            新增的元素
     */
    public void add(Object obj) {
        if(first == null){
            first = new Node(null, obj, null);
            last = first;
        }else{
            Node node = new Node(last, obj, null);
            last.next = node;
            last = node;
        }
        size++;
    }
    public void add(int index, Object obj) {
        Node nodeNext = getNode(index);
        Node nodePrev = nodeNext.prev;
        Node node = new Node(nodePrev, obj, nodeNext);
        nodePrev.next = node;
        nodeNext.prev = node;
        size++;
    }
    /**
     * 返回集合的长度
     * @return size
     */
    public int size() {
        return size;
    }
    /**
     * 返回集合的数组
     * 1、size==0,代表集合中没有元素,返回一个长度为0的数组
     * 2、当index==0时,代表第一个元素,直接赋值
     * 3、node是当前元素,赋值之后,要让node=node.next,代表当前元素要向后指向
     * @return 数组
     */
    public Object[] toArray() {
        if(size == 0){
            return new Object[0];
        }
        Object[] result = new Object[size];
        int index = 0;
        Node node = first.next;
        while(true){
            if(index == 0){
                result[index++] = first.element;
            }
            if(node == null){
                break;
            }
            result[index++] = node.element;
            node = node.next;
        }
        return result;
    }
    /**
     * 通过索引值获取元素
     *     调用了getNode方法,获取了index的Node对象,返回他的element值
     * @param index 索引
     * @return 元素
     */
    public Object get(int index) {
        return getNode(index).element;
    }
    /**
     * 通过索引获取Node对象
     * @param index 索引
     * @return Node对象
     */
    private Node getNode(int index) {
        if(index == 0){
            return first;
        }
        Node node = first;
        for(int i = 0; i < index; i++){
            node = node.next;
        }
        return node;
    }
    private class Node{
        Object element;
        Node next;
        Node prev;
        public Node(Node prev, Object element, Node next){
            this.element = element;
            this.prev = prev;
            this.next = next;
        }
    }
}

原文出处:/show_1EF4sJm88cHV.html