package lesson01; import java.util.NoSuchElementException; public class LinkedList<E> implements List<E> { private int size; private Node<E> head; private Node<E> last; private Node<E> temp; public LinkedList() { head = new Node<E>(); } @Override public boolean add(E e) { add(size, e); return true; } @Override public void add(int index, E element) { if(index < 0 || index > size){ throw new IndexOutOfBoundsException("Error index:" + index); } temp = new Node<E>(); temp.data = element; if(last == null){ //链表中还没有元素 head.next = temp; temp.pre = head; last = temp; }else if(index == size){ //链表中已经有元素,在最后一个元素后面添加元素 last.next = temp; temp.pre = last; last = temp; }else{ Node<E> pos = head.next; for(int i = 0; i < index; i++){ pos = pos.next; } temp.pre = pos.pre; pos.pre.next = temp; pos.pre = temp; temp.next = pos; } size++; temp = null; } @Override public void clear() { while(pollLast() != null){ } } @Override public boolean contains(Object o) { return indexOf(o) >= 0; } @Override public int indexOf(Object o) { temp = head.next; if(o == null){ for(int i = 0; i < size; i++){ if(temp.data == null){ temp = null; return i; } temp = temp.next; } }else{ for(int i = 0; i < size; i++){ if(o.equals(temp.data)){ temp = null; return i; } temp = temp.next; } } return -1; } @Override public E get(int index) { checkIndex(index); temp = head.next; for(int i = 0; i < index; i++){ temp = temp.next; } E obj = temp.data; temp = null; return obj; } private void checkIndex(int index) { if(index < 0 || index >= size){ throw new IndexOutOfBoundsException("Error index: " + index); } } @Override public E remove(int index) { checkIndex(index); E obj = null; if(size == 1){ //链表中只有一个元素 obj = last.data; head.next = null; last.pre = null; last = null; }else if(index == size - 1){ //链表中有两个或更多的元素,但是移除下标为size()-1的元素 obj = last.data; last = last.pre; last.next.pre = null; last.next = null; }else{ temp = head.next; for(int i = 0; i < index; i++){ temp = temp.next; } obj = temp.data; temp.pre.next = temp.next; temp.next.pre = temp.pre; temp.pre = null; temp.next = null; temp = null; } size--; return obj; } @Override public boolean remove(Object o) { int index = indexOf(o); if(index >= 0){ remove(index); return true; } return false; } @Override public E set(int index, E element) { checkIndex(index); temp = head.next; for(int i = 0; i < index; i++){ temp = temp.next; } E obj = temp.data; temp.data = element; temp = null; return obj; } @Override public int size() { return size; } @Override public Object[] toArray() { Object[] arr = new Object[size]; temp = head.next; for(int i = 0; i < size; i++){ arr[i] = temp.data; temp = temp.next; } return arr; } @Override public Iterator<E> iterator() { return new Ite(); } private class Ite implements Iterator<E>{ int pos; int lastRet = -1; @Override public boolean hasNext() { return pos < size; } @Override public E next() { if(pos == size){ throw new NoSuchElementException(); } E element = get(pos); lastRet = pos; pos++; // E element = get(lastRet = pos++); return element; } @Override public void remove() { if(lastRet == -1){ throw new RuntimeException(); } LinkedList.this.remove(lastRet); lastRet = -1; } } private static final class Node<E>{ E data; Node<E> next; Node<E> pre; } public void addFirst(E e){ add(0, e); } public void addLast(E e){ add(size, e); } public E removeFirst(){ ensureElementExists(); return remove(0); } private void ensureElementExists() { if(size == 0){ throw new NoSuchElementException(); } } public E removeLast(){ ensureElementExists(); return remove(size - 1); } public E getFirst(){ ensureElementExists(); return get(0); } public E getLast(){ ensureElementExists(); return get(size - 1); } public E pollFirst(){ if(size == 0){ return null; } return remove(0); } public E pollLast(){ if(size == 0){ return null; } return remove(size - 1); } public E peekFirst(){ if(size == 0){ return null; } return get(0); } public E peekLast(){ if(size == 0){ return null; } return get(size - 1); } }