链表实现
package com.zwz.deque;
import java.util.Iterator;
public class DequeServiceImpl<E> implements DequeService<E> {
static class Node<E> {
Node<E> prev; //上一个
E e;
Node<E> next; //下一个
public Node(Node<E> prev, E e, Node<E> next) {
this.prev = prev;
this.e = e;
this.next = next;
}
}
final int capacity = 10;
int size = 0;
/**
* 哨兵
*/
Node<E> head = new Node<>(null,null,null);
public DequeServiceImpl(){
head.prev = head;
head.next = head;
}
@Override
public Boolean offerFirst(E value) {
if (isfull()) {
return false;
}
Node<E> a = head;
Node<E> b = head.next;
Node<E> added = new Node<>(a,value,b);
a.next = added;
b.prev = added;
size++;
return true;
}
@Override
public Boolean offerLast(E value) {
if (isfull()) {
return false;
}
Node<E> a = head.prev;
Node<E> b = head;
Node<E> added = new Node<>(a,value,b);
a.next = added;
b.prev = added;
size++;
return true;
}
@Override
public E pollFirst() {
if (isEmpty()) {
return null;
}
Node<E> a = head;
Node<E> removed = a.next;
Node<E> b = removed.next;
a.next = b;
b.prev = a;
size--;
return removed.e;
}
@Override
public E pollLast() {
if (isEmpty()) {
return null;
}
Node<E> b = head;
Node<E> removed = b.prev;
Node<E> a = removed.prev;
a.next = b;
b.prev = a;
size--;
return removed.e;
}
@Override
public E peekFirst() {
if (isEmpty()) {
return null;
}
return head.next.e;
}
@Override
public E peekLast() {
if (isEmpty()) {
return null;
}
return head.prev.e;
}
@Override
public Boolean isfull() {
return size == capacity;
}
@Override
public Boolean isEmpty() {
return size == 0;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
Node<E> p = head.next;
@Override
public boolean hasNext() {
return p != head;
}
@Override
public E next() {
E e = p.e;
p = p.next;
p.next.prev = p;
return e;
}
};
}
}
数组实现
package com.zwz.deque;
import java.util.Iterator;
public class DequeServiceImpl2<E> implements DequeService<E> {
E[] array = (E[]) new Object[5];
int head = 0;//头
int tail = 0;//尾
//加1时候,保证指针合法
int inc(int i) {
if (i + 1 > array.length-1) {
return 0;
}
return i + 1;
}
int dec(int i) {
if (i - 1 < 0) {
return array.length - 1;
}
return i - 1;
}
@Override
public Boolean offerFirst(E value) {
if (isfull()) {
return false;
}
head = dec(head);
array[head] = value;
return true;
}
@Override
public Boolean offerLast(E value) {
if (isfull()) {
return false;
}
array[tail] = value;
tail = inc(tail);
return true;
}
@Override
public E pollFirst() {
if (isEmpty()) {
return null;
}
E e = array[head];
array[head] = null;
head = inc(head);
return e;
}
@Override
public E pollLast() {
if (isEmpty()) {
return null;
}
tail = dec(tail);
E e = array[tail];
array[tail] = null;
return e;
}
@Override
public E peekFirst() {
if (isEmpty()) {
return null;
}
return array[head];
}
@Override
public E peekLast() {
if (isEmpty()) {
return null;
}
return array[dec(tail)];
}
@Override
public Boolean isfull() {
int addTail = inc(tail);
return addTail == head;
}
@Override
public Boolean isEmpty() {
return head == tail;
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
int p = head;
@Override
public boolean hasNext() {
return p != tail;
}
@Override
public E next() {
E e = array[p];
p = inc(p);
return e;
}
};
}
}