package com.vvv.base;
public class LinkedList implements IList {
private int size;
private Node<Object> head;
private Node<Object> tail;
@Override
public void add(Object o) {
Node<Object> node = new Node<Object>(o);
if (head == null) {
head = node;
tail = node;
} else {
tail.next = node;
node.prev = tail;
tail = node;
}
size++;
}
@Override
public void add(int index, Object o) {
check(index);
Node<Object> node = new Node<Object>(o);
Node<Object> temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
if (temp.prev != null && temp.next != null) {
Node<Object> prevNode = temp.prev;
prevNode.next = node;
node.prev = prevNode;
node.next = temp;
temp.prev = node;
} else if (temp.prev == null) {
head = node;
temp.prev = node;
node.next = temp;
} else if (temp.next == null) {
temp.next = node;
node.prev = temp;
tail = node;
}
size++;
}
@Override
public Object get(int index) {
check(index);
Node<Object> temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
return temp.data;
}
@Override
public Object remove(int index) {
check(index);
Node<Object> temp = head;
for (int i = 0; i < index; i++) {
temp = temp.next;
}
Object oldValue = temp.data;
if (temp.prev != null && temp.next != null) {
temp.prev.next = temp.next;
temp.next.prev = temp.prev;
temp = null;
} else if (temp.prev == null) {
head = temp.next;
temp.next.prev = null;
temp = null;
} else if (temp.next == null) {
tail = temp.prev;
temp.prev.next = null;
temp = null;
}
size--;
return oldValue;
}
public boolean remove(Object obj) {
Node<Object> temp = head;
for (int i = 0; i < size; i++) {
if (obj.equals(temp.data)) {
remove(i);
return true;
}
temp = temp.next;
}
return false;
}
private void check(int index) {
if (index < 0 || index > size)
throw new IndexOutOfBoundsException("index: " + index + ", size: "
+ size);
}
@Override
public int size() {
return size;
}
@SuppressWarnings("hiding")
private static class Node<Object> {
Object data;
Node<Object> next;
Node<Object> prev;
public Node(Object data) {
this.data = data;
}
}
}