public class LinkedList<E> {
private Node<E> first;
private Node<E> last;
private int size;
private class Node<E> {
private Node<E> prev;
private Node<E> next;
E element;
public Node(Node<E> prev, E e, Node<E> next) {
this.prev = prev;
this.element = e;
this.next = next;
}
}
public void addFirst(E e) {
final Node<E> oldFirst = first;
final Node<E> newNode = new Node(null, e, oldFirst);
first = newNode;
if (first == null) {
first = newNode;
} else {
oldFirst.prev = first;
}
size++;
}
public void addLast(E e) {
final Node<E> oldLast = last;
final Node<E> newNode = new Node(oldLast, e, null);
last = newNode;
if (first == null) {
first = newNode;
} else {
oldLast.next = newNode;
newNode.prev = oldLast;
}
size++;
}
public boolean add(E e) {
addLast(e);
return true;
}
public void add(int index, E e) {
check(index);
if (index == size) {
addLast(e);
} else {
Node<E> succ = node(index);
Node<E> pred = succ.prev;
Node<E> newNode = new Node<>(pred, e, succ);
if (pred == null) {
first = newNode;
} else {
succ.prev = newNode;
pred.next = newNode;
}
size++;
}
}
public void remove(int index) {
Node<E> r = node(index);
Node<E> pred = r.prev;
Node<E> next = r.next;
if (pred == null) {
first = next;
size--;
return;
}
if (next == null) {
last = pred;
size--;
return;
}
pred.next = next;
next.prev = pred;
r.element = null;
size--;
}
private Node<E> node(int index) {
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--) {
x = x.prev;
}
return x;
}
}
private void check(int index) {
if (index < 0 || index > size) {
System.out.println("插入位置不合法");
return;
}
}
public int size() {
return this.size;
}
public E get(int index) {
return node(index).element;
}
private class Iterator {
private Node<E> lastReturn;
private Node<E> next;
private int cursor;
public Iterator(int index) {
next = (index == size) ? null : node(index);
cursor = index;
}
public boolean hasNext() {
return cursor != size;
}
public E next() {
int i = cursor;
lastReturn = next;
next = next.next;
cursor = i + 1;
return lastReturn.element;
}
}
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1);
list.add(13);
list.add(5);
list.add(31);
list.add(2);
list.add(5, 4);
list.remove(0);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("-------");
System.out.println(list.size());
System.out.println("-------");
for(LinkedList.Iterator i= list.new Iterator(0);i.hasNext();){
System.out.println(i.next());
}
}
}