分别用单链表实现队列(先进先出)和栈(现金后出)
Java
public class LinkedListToQueueAndStack {
public static class Node<V> {
public V value;
public Node<V> next;
public Node(V v) {
value = v;
next = null;
}
}
public static class MyQueue<V> {
private Node<V> head;
private Node<V> tail;
private int size;
public MyQueue() {
head = null;
tail = null;
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
public void offer(V value) {
Node<V> cur = new Node<V>(value);
if (tail == null) {
head = cur;
tail = cur;
} else {
tail.next = cur;
tail = cur;
}
size++;
}
// C/C++的同学需要做节点析构的工作
public V poll() {
V ans = null;
if (head != null) {
ans = head.value;
head = head.next;
size--;
}
if (head == null) {
tail = null;
}
return ans;
}
// C/C++的同学需要做节点析构的工作
public V peek() {
V ans = null;
if (head != null) {
ans = head.value;
}
return ans;
}
}
public static class MyStack<V> {
private Node<V> head;
private int size;
public MyStack() {
head = null;
size = 0;
}
public boolean isEmpty() {
return size == 0;
}
public int size() {
return size;
}
public void push(V value) {
Node<V> cur = new Node<>(value);
if (head == null) {
head = cur;
} else {
cur.next = head;
head = cur;
}
size++;
}
public V pop() {
V ans = null;
if (head != null) {
ans = head.value;
head = head.next;
size--;
}
return ans;
}
public V peek() {
return head != null ? head.value : null;
}
}
Python
class LinkedList2QueueAndStack:
class myQueue:
"""
用单链表实现队列
"""
def __init__(self, head: ListNode, tail: ListNode, size: int):
self.head = head
self.tail = tail
self.size = 0
def isEmpty(self):
return self.size == 0
def offer(self, value: int):
"""往队列中插入值"""
# 生成新节点
cur = ListNode(val=value)
if not self.tail: # 说明此时队列为空,将头和尾指针分别指向新节点
self.head = cur
self.tail = cur
else:
self.tail.next = cur
self.tail = cur
self.size += 1
def poll(self):
"""
出列,即将头节点从队列中移出
:return:
"""
res = None
if self.head:
res = self.head.val
self.head = self.head.next
self.size -= 1
# 如果此时头节点为空了,那将尾结点也置为空
if not self.head:
self.tail = None
return res
class myStack:
"""
用单链表实现栈
"""
def __init__(self, head: ListNode, size: int):
self.head = head
self.size = size
def isEmpty(self):
return self.size == 0
def push(self, value: int):
"""
压栈
:param value:
:return:
"""
# 生成新节点
cur = ListNode(val=value)
if not self.head:
self.head = cur
else:
cur.next = self.head
self.head = cur
self.size += 1
def pop(self):
"""
出栈
:return:
"""
res = None
if self.head:
res = self.head.val
self.head = self.head.next
self.size -= 1
return res