package dataStructure;
/**
* Created by LvZhenxing on 2017/2/21.
*/
public class LinkedList implements List {
private Node head=new Node();
private int size = 0;
public void add(Object o) {
addToNode(head,o);
size++;
}
public void add(int index, Object o) {
if (index <0 || index > size) {
throw new IndexOutOfBoundsException("index out of bound");
}
addToNode(getLastNode(index),o);
size++;
}
private Node getLastNode(int index){
Node nowNode = head;
for (int pos = 1; pos <= index; pos++) {
nowNode = nowNode.next;
}
return nowNode;
}
private void addToNode(Node node,Object o){
if (node.next == null) {
Node newNode = new Node();
newNode.data = o;
node.next = newNode;
} else {
Node newNode = new Node();
newNode.data = o;
newNode.next = node.next;
node.next = newNode;
}
}
public Object get(int index) {
if (index <0 || index > size - 1) {
throw new IndexOutOfBoundsException("index out of bound");
}
Node node= getLastNode(index);
return node.next==null?null:node.next.data;
}
public Object remove(int index) {
if (index <0 || index > size - 1) {
throw new IndexOutOfBoundsException("index out of bound");
}
Node node= getLastNode(index);
Node nowNode=node.next;
if(nowNode.next!=null){
node.next=node.next.next;
}else{
node.next=null;
}
size--;
return nowNode.data;
}
public int size() {
return size;
}
public void addFirst(Object o) {
add(0,o);
}
public void addLast(Object o) {
add(size,o);
}
public Object removeFirst() {
return remove(0);
}
public Object removeLast() {
return remove(size-1);
}
public Iterator iterator() {
return new LinkedListInterator();
}
private class LinkedListInterator implements Iterator {
private int nowIndex = 0;
public boolean hasNext() {
if (nowIndex <= size - 1) {
return true;
}
return false;
}
public Object next() {
return get(nowIndex++);
}
}
private static class Node {
Object data;
Node next;
}
}