package com.qsq.study; public class LinkedList<E> implements List<E>{ private Node<E> first; private Node<E> last; private int size; private static class Node<T> { T item; Node<T> prev; Node<T> next; public Node(Node<T> prev, T item, Node<T> next) { this.prev = prev; this.item = item; this.next = next; } } /* * �޲������캯�� */ public LinkedList() { first = null; last = first; size = 0; } @Override public int size() { return this.size; } @Override public boolean isEmpty() { return size == 0; } private void rangeCheck(int index) { if (index < 0 || index >= size) { throw new IndexOutOfBoundsException("Index:" + index + ", Size:" + size); } } @Override public boolean add(E e) { if (first == null) { // ����Ϊ�� first = new Node<E>(null, e, null); } else if (last == null) { // β���Ϊ�� last = new Node<E>(first, e, null); first.next = last; } else { Node<E> node = new Node<E>(last, e, null); last.next = node; last = node; } ++size; return true; } @Override public boolean remove(Object o) { int index = indexOf(o); if (index < 0 || index > size) { return false; } remove(index); return true; } @Override public E remove(int index) { rangeCheck(index); Node<E> current = first; while (index > 0) { --index; if (current == null) { return null; } current = current.next; } E oldItem = current.item; if (current.prev == null) { // ɾ������ͷ��� first = current.next; if (current.next != null) { current.next.prev = null; } } else { current.prev.next = current.next; if (current.next != null) { current.next.prev = current.prev; } } --size; return oldItem; } @Override public E get(int index) { rangeCheck(index); int i = 0; Node<E> current = first; while (i < index) { if (current == null) { return null; } ++i; current = current.next; } return current.item; } @Override public E set(int index, E element) { rangeCheck(index); Node<E> current = first; while (index > 0) { --index; current = current.next; } E oldElement = current.item; current.item = element; return oldElement; } @Override public int indexOf(Object o) { if (first == null) { return -1; } Node<E> current = first; int index = 0; if (o == null) { while (current != null) { if (current.item == null) { return index; } else { current = current.next; ++index; } } } else { while (current != null) { if (o.equals(current.item)) { return index; } else { current = current.next; ++index; } } } return -1; } }