用双向链表实现双向队列
双向链表定义:可分别从对头和队尾出列和入列,因此需要实现4种方法。
Python
class DoubleListNode:
"""双向链表节点"""
def __init__(self, val=0, next=None, last=None):
self.next = next
self.last = last
self.val = val
class DoubleLinkedList2Deque:
"""
双向链表实现双向队列
"""
class myDeque:
def __init__(self, head: DoubleListNode, tail: DoubleListNode, size: int):
self.head = head
self.tail = tail
self.size = size
def isEmpty(self):
return self.size == 0
def pushHead(self, value: int):
"""
从队列头插入数据
:param value:
:return:
"""
cur = DoubleListNode(value)
if not self.head: # 说明此时双向队列为空,将头和尾指针分别指向新节点
self.head = cur
self.tail = cur
else:
cur.next = self.head
self.head.last = cur
self.head = cur
self.size += 1
def pushTail(self, value: int):
"""
从队列尾插入数据
:param value:
:return:
"""
cur = DoubleListNode(value)
if not self.head: # 说明此时双向队列为空,将头和尾指针分别指向新节点
self.head = cur
self.tail = cur
else:
self.tail.next = cur
cur.last = self.tail
self.tail = cur
def pollHead(self):
"""
从队列头弹出数据
:param value:
:return:
"""
res = None
if not self.head:
return res
res = self.head.val
if self.head == self.tail:
self.head = None
self.tail = None
else:
self.head = self.head.next
self.head.last = None
self.size -= 1
return res
def pollTail(self):
"""
从队列尾弹出数据
:param value:
:return:
"""
res = None
if not self.head:
return res
res = self.head.val
if self.head == self.tail:
self.head = None
self.tail = None
else:
self.tail = self.tail.last
self.tail.next = None
self.size -= 1
return res
Java
public class DoubleLinkedListToDeque {
public static class Node<V> {
public V value;
public Node<V> last;
public Node<V> next;
public Node(V v) {
value = v;
last = null;
next = null;
}
}
public static class MyDeque<V> {
private Node<V> head;
private Node<V> tail;
private int size;
public MyDeque() {
head = null;
tail = null;
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
public void pushHead(V value) {
Node<V> cur = new Node<>(value);
if (head == null) {
head = cur;
tail = cur;
} else {
cur.next = head;
head.last = cur;
head = cur;
}
size++;
}
public void pushTail(V value) {
Node<V> cur = new Node<>(value);
if (head == null) {
head = cur;
tail = cur;
} else {
tail.next = cur;
cur.last = tail;
tail = cur;
}
size++;
}
public V pollHead() {
V ans = null;
if (head == null) {
return ans;
}
size--;
ans = head.value;
if (head == tail) {
head = null;
tail = null;
} else {
head = head.next;
head.last = null;
}
return ans;
}
public V pollTail() {
V ans = null;
if (head == null) {
return ans;
}
size--;
ans = tail.value;
if (head == tail) {
head = null;
tail = null;
} else {
tail = tail.last;
tail.next = null;
}
return ans;
}
public V peekHead() {
V ans = null;
if (head != null) {
ans = head.value;
}
return ans;
}
public V peekTail() {
V ans = null;
if (tail != null) {
ans = tail.value;
}
return ans;
}
}