package task1; import java.util.Iterator; /** * LinkedList 实现 */ public class MyLinkedList<T> implements MyList<T> { //存放的元素数量 private int size; private Node<T> head; public MyLinkedList() { head = new Node<>(null, null); } @Override public void add(T o) { add(size, o); } @Override public void add(int index, T o) { if (index < 0 || index > size) throw new IndexOutOfBoundsException("index " + index + " 不合法"); Node<T> targetNode = new Node<>(null, o); Node<T> targetPrevNode = getPrevNode(index); targetNode.next = targetPrevNode.next; targetPrevNode.next = targetNode; size++; } @Override public T get(int index) { checkIndexRange(index); return getPrevNode(index).next.data; } @Override public T remove(int index) { checkIndexRange(index); Node<T> prevNode = getPrevNode(index); Node<T> nodeToRemove = prevNode.next; prevNode.next = nodeToRemove.next; size--; return nodeToRemove.data; } @Override public int size() { return size; } public void addFirst(T o) { add(0, o); } public void addLast(T o) { add(size, o); } public T removeFirst() { return remove(0); } public T removeLast() { return remove(size - 1); } public Iterator<T> iterator() { return new MyLinkedItr(); } /** * 找到位置为index的前一个node * * @param index 索引值 */ private Node<T> getPrevNode(int index) { Node<T> targetPrevNode = head; for (int i = 0; i < index; i++) { targetPrevNode = targetPrevNode.next; } return targetPrevNode; } /** * 检查索引是否越界 * * @param index 索引值 */ private void checkIndexRange(int index) { if (index < 0 || index >= size) throw new IndexOutOfBoundsException("index " + index + " 越界"); } private static class Node<T> { private Node<T> next; private T data; private Node(Node<T> next, T data) { this.next = next; this.data = data; } } private class MyLinkedItr implements Iterator<T> { private Node<T> currentNode = head; @Override public boolean hasNext() { return currentNode.next != null; } @Override public T next() { Node<T> nextNode = currentNode.next; T data = nextNode.data; currentNode = nextNode; return data; } } }