package com.coding.basic;
public class LinkedList implements List {
private Node head=new Node();
public void add(Object o){
if(head.data==null){
head.data=o;
return;
}
Node node=head;
for(;node.next!=null;){
node=node.next;
}
node.next=new Node();
node.next.data=o;
}
public void add(int index , Object o){
if(index==0){
addFirst(o);
return;
}
Node node=head;
for(int i=0;i<index;i++){
node=node.next;
if(node==null){
node=new Node();
}
}
node.data=o;
return;
}
public Object get(int index){
Node node=head;
for(int i=0;i<index;i++){
node=node.next;
}
return node.data;
}
public Object remove(int index){
if(index==0){
Object data=head.data;
removeFirst();
return data;
}
Node node=head;
for(int i=0;i<index-1;i++){
node=node.next;
}
Object data=node.next.data;
node.next=node.next.next;
return data;
}
public int size(){
int i =0;
Node node=head;
while (node!=null) {
node=node.next;
i++;
}
return i;
}
public void addFirst(Object o){
Node node = new Node();
node.data=o;
node.next=head;
head=node;
}
public void addLast(Object o){
add(o);
}
public Object removeFirst(){
Object data=head.data;
head=head.next;
if(head==null){
head=new Node();
}
return data;
}
public Object removeLast(){
Object data = null;
Node node=head;
for(;node.next!=null;){
if(node.next.next==null){
data=node.next.next;
node.next=node.next.next;
break;
}
node=node.next;
}
return data;
}
public Iterator iterator(){
return new Iterator() {
Node node=head;
@Override
public Object next() {
Object data=node.data;
node=node.next;
return data;
}
@Override
public boolean hasNext() {
return node==null?false:true;
}
};
}
private static class Node{
Object data;
Node next;
}
}