/**
* 用双向链表实现双端队列
* 双端队列 可以从头进 也可以从尾进,可以从头出,也可以从尾出
*/
public class Code03_DoubleLinkedListToDeque {
public static class Node<V>{
public V value;
public Node<V> last;
public Node<V> next;
public Node(V value) {
this.value = value;
}
}
public class MyDeque<V>{
public Node<V> head;
public Node<V> tail;
public int size;
//从头进 每次新增节点,需要 把head 往前移
public void pushHead(V v){
Node<V> cur = new Node<>(v);
if (head == null) {
head = cur;
tail = cur;
}else{
cur.next = head;
head.last = cur;
head = cur;
}
size++ ;
}
//从尾部push 每次新增节点,需要 把tail 往后移
public void pushTail(V v){
Node<V> cur = new Node<>(v);
if (tail == null){
tail = cur;
head = cur;
}else{
tail.next = cur;
cur.last = tail;
tail = cur;
}
size++;
}
//从头弹出 head 往后移
public V pollHead(){
V value = null;
if (head == null)
return value;
value = head.value;
if (head == tail){
head = null;
tail = null;
}else {
head = head.next;
head.last = null;
}
return value;
}
//从尾部弹出 tail往前移
public V pollTail(){
V value = null;
if (head == null)
return value;
value = tail.value;
if (head == tail){
head = null;
tail = null;
}else {
tail = tail.last;
tail.next = null;
}
return value;
}
//从头部取将要弹出的节点数据
public V peekHead(){
V value = null;
if (head != null)
value = head.value;
return value;
}
//从尾部取将要弹出的节点数据
public V peekTail(){
V value = null;
if (tail != null)
value = tail.value;
return value;
}
}
}
用双向链表实现双端队列
最新推荐文章于 2023-05-04 23:18:23 发布