package com.myutil; import java.text.MessageFormat; import java.util.NoSuchElementException; /** * 链表列表 */ public class LinkedList<T> implements List<T> { private Node header = new Node(); private int size = 0; private Node lastNode() { return findNode(this.size); } private Node findNode(int index) { int current = 0; Node targetNode = header; while (current < index) { targetNode = targetNode.next; current++; } return targetNode; } /** * 判断边界 * <p> * <pre> * 若 index < 0 或者 index > size 则抛出非法参数异常 * </pre> * * @param index 当前索引 */ private void judgeRange(int index) { if (index < 0) { throw new IllegalArgumentException( MessageFormat.format("Index is must be great or equal then 0. index:{0}", index)); } if (index >= this.size) { throw new IllegalArgumentException( MessageFormat.format("Index is must be less then size(). index:{0}", index)); } if (this.size == Integer.MAX_VALUE) { throw new IllegalArgumentException("Array already can not Expansion."); } } public LinkedList() { } @Override public void add(T element) { Node lastNode = lastNode(); Node addNode = new Node(); addNode.element = element; lastNode.next = addNode; this.size++; } @Override public void add(T element, int index) { judgeRange(index); Node targetNode = findNode(index); Node addNode = new Node(); addNode.element = element; addNode.next = targetNode.next; targetNode.next = addNode; this.size++; } @Override public T remove(int index) { judgeRange(index); Node targetNode = findNode(index); Node removeNode = targetNode.next; targetNode.next = targetNode.next.next; T element = (T) removeNode.element; this.size--; return element; } @Override public T get(int index) { judgeRange(index); return (T) findNode(index).next.element; } @Override public int size() { return this.size; } /** * 添加一个元素到最开始的位置 * * @param element 元素 */ public void addFirst(T element) { add(element, 0); } /** * 添加一个元素到最后 * * @param element 元素 */ public void addLast(T element) { add(element, this.size - 1); } /** * 删除第一个元素 * * @return 第一个元素 */ public T removeFirst() { if (this.size == 0) { throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); } return remove(0); } /** * 删除最后一个元素 * * @return 最后一个元素 */ public T removeLast() { if (this.size == 0) { throw new ArrayIndexOutOfBoundsException("This list is empty, don't to remove."); } return remove(this.size - 1); } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("["); Node indexNode = header.next; while (indexNode != null) { sb.append((T) indexNode.element); if (indexNode.next != null) { sb.append(","); } indexNode = indexNode.next; } sb.append("]"); return sb.toString(); } /** * 获取迭代器 * * @return 迭代器 */ public Iterator<T> iterator() { return new LinkedListIterator(); } private class LinkedListIterator implements Iterator<T> { int position = 0; int lastRet = -1; public boolean hasNext() { return position < LinkedList.this.size(); } public T next() { if (position >= size) { throw new NoSuchElementException(); } int i = position; T element = LinkedList.this.get(position++); lastRet = i; return element; } public T remove() { if (lastRet < 0) { throw new IllegalStateException(); } T removeElement = LinkedList.this.remove(lastRet); position = lastRet; lastRet = -1; return removeElement; } } private static class Node<T> { T element; Node next; } public static void main(String[] args) { LinkedList<Integer> ids = new LinkedList<>(); for (int i = 0; i < 11; i++) { ids.add(i); } Iterator iterator = ids.iterator(); System.out.println(ids); } }