class Node<E>{
E item;
Node prev, next;
Node(E newItem){
item = newItem;
prev = next =null;
}
}
class CircularDoublyLinkedList{
private Node head;
private Node tail;
private int size;
CircularDoublyLinkedList(){
}
void addFirst(Node n){
if(size == 0) head = tail = n;
else if(size == 1){
head = n;
head.next = tail;
head.prev = tail;
tail.prev = head;
tail.next = head;
}
else{
head.prev = n;
n.next = head;
n.prev = tail;
head = n;
tail.next = head;
}
size ++;
}
void addLast(Node n){
if(size == 0) head = tail = n;
else if(size == 1){
head.next = n;
head.prev = n;
n.prev = head;
n.next = head;
tail = n;
}
else {
tail.next = n;
n.prev = tail;
n.next = head;
head.prev = n;
tail = n;
}
size ++;
}
void add(int index, Node n){
if(index == 0) addFirst(n);
else if(index >= size) addLast(n);
else{
Node cur = head;
for(int i = 1; i < index; i++)
cur = cur.next;
Node temp = cur.next;
cur.next = n;
n.prev = cur;
n.next = temp;
temp.prev = n;
size ++;
}
}
Node removeFirst(){
Node remove = head;
if(size == 0) return null;
else if(size == 1)
head = tail =null;
else if(size == 2){
head = tail;
head.prev = null;
head.next = null;
}
else{
Node temp = head.next;
temp.prev = tail;
tail.next = temp;
head = temp;
}
size --;
return remove;
}
Node removeLast(){
Node remove = tail;
if(size == 0) return null;
else if(size == 1)
head = tail = null;
else if(size == 2){
tail = head;
head.prev = null;
head.next = null;
}
else{
Node temp = tail.prev;
temp.next = head;
head.prev = temp;
tail = temp;
}
size --;
return remove;
}
Node remove(int index){
if(index < 0 || index >= size) return null;
else if(index == 0) return removeFirst();
else if(index == size - 1) return removeLast();
else{
Node previous = head;
for(int i = 1; i < index; i ++)
previous = previous.next;
Node remove = previous.next;
Node temp = remove.next;
previous.next = temp;
temp.prev = previous;
size --;
return remove;
}
}
}