package test; import java.util.Collection; /** * Created by weige on 2018/6/11. */ /** * LinkedList是另外一个实现了List的集合类 * 这个类底层维护的一个双向链表,不需要考虑扩容的问题 * @param <E> 元素类型 */ public class LLinkedList<E> { private int size; private Node<E> first; private Node<E> last; /** * * @param <E> 元素类型 */ private class Node<E> { private E element; private Node<E> prev; private Node<E> next; public Node(Node<E> prev, E element, Node<E> next) { this.element = element; this.prev = prev; this.next = next; } } public LLinkedList() { // default constructor } public LLinkedList(Collection<E> c) { // do something; throw new IllegalAccessError(); // 这个构造器就没写了,因为觉得LinkedList的核心就是对链表的操作 } /** * 尾部追加节点,这也是所有add操作底部动作,头部追加节点同理 * @param e 要添加的内容 */ public void linkAsLast(E e) { Node<E> pr = last; Node<E> newNode = new Node<>(pr, e, null); last = newNode; if (pr == null) { first = newNode; } else { pr.next = newNode; } size++; } /** * 节点的释放 * @param x 要释放的节点 * @return 释放节点的内容 */ public E unlink(Node<E> x) { E element = x.element; Node<E> prev = x.prev; Node<E> next = x.next; if (prev == null) { //删除的是头节点 first = next; } else { prev.next = next; x.prev = null; } if (next == null) { //删除的是尾 last = prev; } else { next.prev = prev; x.next = null; } size--; x.element = null; //节点释放之后要帮助 return element; } /** * 按索引医促会元素 * @param index 索引 * @return 删除的元素的内容 */ public E remove(int index) { checkBound(index); //检查索引范围 Node<E> node = node(index); E e = node.element; unlink(node); return e; } private void checkBound(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("wrong index:" + index + ", size :" + size); } } /** 获取索引对应的节点,也就是链表的查找 */ public Node<E> node(int index) { if (index < (size >> 1)) { Node<E> node = first; for (int i = 0; i < index; i++) { node = node.next; } return node; } else { Node<E> node = last; for (int i = size - 1; i > index; i--) { node = node.prev; } return node; } } /** * 获取元素的索引 * @param e 元素 * @return 元素的索引 */ public int indexOf(E e) { int index = 0; if (e == null) { for (Node<E> node = first; node != null; ) { if (node.element == null) { return index; } node = node.next; index++; } } else { for (Node<E> node = first; node != null; ) { if (node.element.equals(e)) { return index; } node = node.next; index++; } } return -1; } /** * 添加元素 * @param e 添加的元素 */ public void add(E e) { linkAsLast(e); } public int size() { return size; } /** * 清空整个集合,需要释放所有的索引 */ public void clear() { for (Node<E> node = first; node != null; ) { Node<E> next = node.next; node.element = null; node.prev = null; node.next = null; node = next; } last = first = null; size = 0; } }
容器的底层排序是Timsort,其是一种优化的归并排序
public static void sort(Object[] a) { if (LegacyMergeSort.userRequested) legacyMergeSort(a); else ComparableTimSort.sort(a, 0, a.length, null, 0, 0); }