package com.basic.datastructure;
public class LinkedList implements List {
private Node first;
private Node last;
private int size;
public void add(Object item) {
addLast(item);
}
public void add(int index, Object item) {
checkRange(index);
if (index == 0) {
addFirst(item);
} else if (index == size) {
addLast(item);
} else {
Node tmpNode = new Node(item);
Node preNode = get(index - 1);
Node nextNode = get(index + 1);
preNode.next = tmpNode;
tmpNode.next = nextNode;
size ++;
}
}
public Node get(int index) {
checkRange(index);
if(size > 0){
int loopTimes = 0;
Node p = first;
while(index > loopTimes){
p = p.next;
loopTimes ++;
}
return p;
}
return null;
}
public Object remove(int index) {
checkRange(index);
Node tmpNode = null;
if(index == 0){
removeFirst();
}else if(index == size -1){
removeLast();
}else{
tmpNode = get(index);
Node preNode = get(index-1);
Node nextNode = get(index + 1);
preNode.next = nextNode;
size --;
}
return tmpNode;
}
public int size() {
return size;
}
public void addFirst(Object item) {
if (size == 0) {
first = new Node(item);
last = first;
} else {
Node tmpNode = new Node(item);
tmpNode.next = first;
first = tmpNode;
}
size++;
}
public void addLast(Object item) {
if (size == 0) {
first = new Node(item);
last = first;
} else {
last.next = new Node(item);
last = last.next;
}
size++;
}
public Object removeFirst() {
Node tmpNode = first;
if(tmpNode == null){
last = null;
}else if(size == 2){
first = last;
last = null;
size --;
}else{
first = first.next;
size--;
}
return tmpNode;
}
public Object removeLast() {
Node tmpNode = null;
if(size == 1){
this.removeFirst();
}else if(size >0){
int index = size - 1;
tmpNode = last;
get(index - 1).next = null;
last = get(index - 1);
size --;
}
return tmpNode;
}
private void checkRange(int index) {
if (index > size || index < 0) {
throw new IndexOutOfBoundsException("Index: " + index + "Size: " + size);
}
}
public String toString() {
StringBuilder sb = new StringBuilder();
Node p = first;
while (p != null) {
sb.append(p.item + "\n");
p = p.next;
}
return sb.toString();
}
private static class Node {
private Object item;
private Node next;
Node(Object item) {
this.item = item;
}
}
public static void main(String[] args) {
/*Test add
LinkedList list = new LinkedList();
for (int i = 0; i <= 5; i++) {
list.add(i);
}
list.add(3, "test");
System.out.println(list);
*/
/*Test remove
list.remove(3);
System.out.println(list);
*/
/*Test removeLast and removeFirst
System.out.println(list);
list.removeLast();
System.out.println(list);
list.removeLast();
System.out.println(list);
list.removeLast();
System.out.println(list);
*/
/*Test from Java API
java.util.LinkedList<String> linkedList = new java.util.LinkedList<String>();
linkedList.add("test");
linkedList.removeFirst();
System.out.println(linkedList);
*/
}
}