package com.coding.basic;
public class LinkedList implements List {
private Node head;
private Node last;
private int size = 0;
public void add(Object o) {
addLast(o);
}
public void add(int index, Object o) {
checkPosition(index);
if (index == size) {
addLast(o);
} else {
addIndex(index, o);
}
}
public Object get(int index) {
return node(index).data;
}
public Object remove(int index) {
checkPosition(index);
Object old = get(index);
if (index == 0) {
removeFirst();
} else if (index == size - 1) {
removeLast();
} else {
node(index - 1).next = node(index + 1);
size--;
}
return old;
}
public int size() {
return size;
}
public void addFirst(Object o) {
Node h = head;
Node newNode = new Node(o, h);
head = newNode;
if (h == null) {
last = newNode;
}
size++;
}
public void addLast(Object o) {
Node l = last;
Node newNode = new Node(o, null);
last = newNode;
if (l == null) {
head = newNode;
} else {
l.next = newNode;
}
size++;
}
public Object removeFirst() {
Node old = head;
head = old.next;
size--;
return old.data;
}
public Object removeLast() {
Node old = last;
Node prev = node(size - 2);
last = prev;
size--;
return old.data;
}
public Iterator iterator() {
return null;
}
private void checkPosition(int index) {
if (index < 0 || index >= size) {
throw new RuntimeException("out of memory");
}
}
private void addIndex(int index, Object o) {
checkPosition(index);
Node newNode = new Node(o, node(index));
if (index != 0) {
node(index - 1).next = newNode;
} else {
head = newNode;
}
size++;
}
private Node node(int index) {
Node x = head;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
private static class Node {
Object data;
Node next;
public Node(Object data, Node next) {
this.data = data;
this.next = next;
}
}
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.addLast("last");
System.out.println(list.size());
list.addFirst("head");
System.out.println(list.size());
list.add(0, "0Object");
System.out.println(list.size());
list.add(2, "2Object");
System.out.println(list.size());
list.removeLast();
System.out.println(list.size());
list.removeFirst();
System.out.println(list.size());
list.removeLast();
System.out.println(list.size());
list.get(0);
System.out.println(list.size());
}
}