package com.coding.basic; import java.util.Collection; /** * LinkedList (单链表) 第14小组 296933284 * * @author Tonnyson * */ public class LinkedList<T> implements List<T> { private Node<T> head; private int size; public LinkedList() { super(); this.head = new Node<T>(null); } @Override public boolean add(T element) { addLast(element); return true; } @Override public void add(int index, T element) { if (index == size) { addLast(element); } else { Node<T> r = getPreNode(index); Node<T> node = new Node<>(element); node.next = r.next; r.next = node; size++; } } public void addFirst(T element) { Node<T> node = new Node<>(element); node.next = head.next; head.next = node; size++; } public void addLast(T element) { Node<T> node = new Node<>(element); Node<T> r = head; while (r.next != null) r = r.next; r.next = node; size++; } public void addAll(Collection<T> c) { Iterator<T> iter = (Iterator<T>) c.iterator(); while (iter.hasNext()) { addLast(iter.next()); } } @Override public T get(int index) { rangCheck(index); return (T) getPreNode(index).next.data; } @Override public T remove(int index) { rangCheck(index); Node<T> r = getPreNode(index); T result = (T) r.next.data; r.next = r.next.next; size--; return result; } public T removeFirst() { return remove(0); } public T removeLast() { return remove(size - 1); } private Node<T> getPreNode(int index) { rangCheck(index); if (index == 0) { return head; } else { Node<T> r = head; for (int i = 0; i < index; i++) r = r.next; return r; } } @Override public int size() { return size; } @Override public boolean isEmpty() { return size == 0; } @Override public Iterator<T> iterator() { return new Iter<>(); } private class Iter<T> implements Iterator<T> { int current = 0; @Override public boolean hasNext() { return current != size; } @Override public T next() { int i = current; rangCheck(i); current++; return (T) get(i); } } private void rangCheck(int index) { if ( index < 0 || index >= size) throw new IndexOutOfBoundsException(); } private static class Node<T> { T data; Node<T> next; Node(T data) { super(); this.data = data; this.next = null; } } }