package com.coding.week1;
public class LinkedList implements List {
private int size;
private Node first;
private Node last;
public static class Node{
Object data;
Node next;
Node prev;
public Node(Node prev,Object data,Node next){
this.data = data;
this.next = next;
this.prev = prev;
}
}
@Override
public void add(Object o) {
final Node l = last;
Node newNode = new Node(last,o,null);
last = newNode;
if(first==null){
first = newNode;
}else{
l.next = newNode;
}
size++;
}
@Override
public void add(int index, Object o) {
if(index>size){
System.out.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size);
return;
}
Node newNode = new Node(null,o,null);
Node nodePre = node(index-1);
Node oldNode = node(index);
if(nodePre!=null){
nodePre.next =newNode;
newNode.prev = nodePre;
}else{
first = newNode;
}
if(oldNode!=null){
oldNode.prev = newNode;
newNode.next = oldNode;
}else{
last = newNode;
}
size++;
}
@Override
public Object get(int index) {
if(!rangeCheck(index)){
return null;
}
return node(index).data;
}
@Override
public Object remove(int index) {
if(!rangeCheck(index)){
return null;
}
Node prevNode = node(index-1);
Node nextNode = node(index+1);
Node rmNode = node(index);
if(prevNode!=null){
prevNode.next = nextNode;
}else{
first=nextNode;
}
if(nextNode!=null){
nextNode.prev = prevNode;
}else{
last = prevNode;
}
size--;
return rmNode.data;
}
@Override
public int size() {
// TODO Auto-generated method stub
return size;
}
public Object head(){
return first.data;
}
public Object last(){
return last.data;
}
public void addFirst(Object o){
add(0,o);
}
public void addLast(Object o){
add(size,o);
}
public Object removeFirst(){
Node f = first;
remove(0);
return f.data;
}
public Object removeLast(){
Node l = last;
remove(size-1);
return l.data;
}
public Node node(int index){
if(index<0){
return null;
}
Node x =null;
if(index<(size<<1)){
x = first;
for(int i=0;i<index;i++ ){
x = x.next;
}
}else{
x = last;
for(int i=size-1;i>index;i--){
x = x.prev;
}
}
return x;
}
public boolean rangeCheck(int index){
if(index>size-1||index<0){
System.err.println("Exception in thread \""+Thread.currentThread()+"\" java.lang.IndexOutOfBoundsException:Index:"+index+",Size:"+size);
return false;
}
return true;
}
public Ito iterator(){
return new Ito();
}
public class Ito implements Iterator{
int cursor;
@Override
public boolean hasNext() {
if(cursor!=size){
return true;
}
return false;
}
@Override
public Object next() {
Object o=node(cursor).data;
cursor++;
return o;
}
}
}