106 lines
2.2 KiB
Java
106 lines
2.2 KiB
Java
|
|
public class SimpleDeque<T> implements MinimalDeque<T> {
|
||
|
|
private static class Node<T> {
|
||
|
|
T value;
|
||
|
|
Node<T> next;
|
||
|
|
Node<T> prev;
|
||
|
|
|
||
|
|
Node(T value) {
|
||
|
|
this.value = value;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private Node<T> head;
|
||
|
|
private Node<T> tail;
|
||
|
|
private int size;
|
||
|
|
|
||
|
|
public SimpleDeque() {
|
||
|
|
head = null;
|
||
|
|
tail = null;
|
||
|
|
size = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public void addFirst(T element) {
|
||
|
|
Node<T> newNode = new Node<>(element);
|
||
|
|
if (isEmpty()) {
|
||
|
|
head = tail = newNode;
|
||
|
|
} else {
|
||
|
|
newNode.next = head;
|
||
|
|
head.prev = newNode;
|
||
|
|
head = newNode;
|
||
|
|
}
|
||
|
|
size++;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public void addLast(T element) {
|
||
|
|
Node<T> newNode = new Node<>(element);
|
||
|
|
if (isEmpty()) {
|
||
|
|
head = tail = newNode;
|
||
|
|
} else {
|
||
|
|
newNode.prev = tail;
|
||
|
|
tail.next = newNode;
|
||
|
|
tail = newNode;
|
||
|
|
}
|
||
|
|
size++;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public T removeFirst() {
|
||
|
|
if (isEmpty()) {
|
||
|
|
throw new IllegalStateException("Deque is empty");
|
||
|
|
}
|
||
|
|
T value = head.value;
|
||
|
|
head = head.next;
|
||
|
|
if (head != null) {
|
||
|
|
head.prev = null;
|
||
|
|
} else {
|
||
|
|
tail = null;
|
||
|
|
}
|
||
|
|
size--;
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public T removeLast() {
|
||
|
|
if (isEmpty()) {
|
||
|
|
throw new IllegalStateException("Deque is empty");
|
||
|
|
}
|
||
|
|
T value = tail.value;
|
||
|
|
tail = tail.prev;
|
||
|
|
if (tail != null) {
|
||
|
|
tail.next = null;
|
||
|
|
} else {
|
||
|
|
head = null;
|
||
|
|
}
|
||
|
|
size--;
|
||
|
|
return value;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public T peekFirst() {
|
||
|
|
if (isEmpty()) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
return head.value;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public T peekLast() {
|
||
|
|
if (isEmpty()) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
return tail.value;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public boolean isEmpty() {
|
||
|
|
return size == 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
@Override
|
||
|
|
public int size() {
|
||
|
|
return size;
|
||
|
|
}
|
||
|
|
}
|