package com.coding.basic; public class LinkedList implements List { private int size = 0; // 头结点 private Node head; // 尾结点 private Node tail; private void rangeCheck(int index) { if (index < 0 || index > size) { throw new IndexOutOfBoundsException(); } } public void add(Object o) { Node node = new Node(o, null); if (head == null) { head = tail = node; } Node oldTail = tail; tail = node; oldTail.next = tail; size++; } public void add(int index, Object o) { rangeCheck(index); if (index == size) { this.add(o); } else { // 保存index处节点 Node x = head; // 保存index-1处的节点 Node y = null; for (int i = 0; i < index; i++) { y = x; x = x.next; } Node node = new Node(o, x); y.next = node; size++; } } public Object get(int index) { rangeCheck(index); Node x = head; for (int i = 0; i < index; i++) { x = x.next; } return x.data; } public Object remove(int index) { rangeCheck(index); Object removeData; if (index == 0) { removeData = removeFirst(); } else if (index == size - 1) { removeData = removeLast(); } else { Node x = head; Node y = head; for (int i = 0; i < index; i++) { y = x; x = x.next; } y.next = x.next; size--; removeData = x.data; } return removeData; } public int size() { return this.size; } public void addFirst(Object o) { Node oldHead = head; head = new Node(o, oldHead); size++; } public void addLast(Object o) { Node oldTail = tail; tail = new Node(o, null); oldTail.next = tail; size++; } public Object removeFirst() { Node oldHead = head; head = oldHead.next; size--; return oldHead.data; } public Object removeLast() { Node oldTail = tail; Node temp = head; for (int i = 0; i < size - 2; i++) { temp = temp.next; } tail = temp; size--; return oldTail.data; } public Iterator iterator() { return new LinkedListIterator(); } private static class Node { Object data; Node next; Node(Object data, Node next) { this.data = data; this.next = next; } } private class LinkedListIterator implements Iterator { Node x = head; @Override public boolean hasNext() { return x != null; } @Override public Object next() { Object data = x.data; x = x.next; return data; } } }