双向链表实现栈和队列


/**
* 双向链表实现栈和队列
*/
public class DoubleEndsNodeToQueueAndStack {

public static class MyQueue<T> {

public DoubleEndsNode<T> nodes;

public MyQueue() {
nodes = new DoubleEndsNode();
}

public void push(T value) {
nodes.addFromHead(value);
}

public T poll() {
return nodes.popFromBottom();
}

public boolean isEmpty() {
return nodes.isEmpty();
}

}

public static class MyStack<T> {

public DoubleEndsNode<T> nodes;

public MyStack() {
nodes = new DoubleEndsNode();
}

public void push(T value) {
nodes.addFromHead(value);
}

public T pop() {
return nodes.popFromHead();
}

public boolean isEmpty() {
return nodes.isEmpty();
}

}

public static class DoubleEndsNode<T> {

public Node<T> head;

public Node<T> tail;

public void addFromHead(T value) {
Node node = new Node(value);
if (head == null) {
head = node;
tail = node;
} else {
node.next = head;
head.pre = node;
head = node;
}
}

public void addFromBottom(T value) {
Node node = new Node(value);
if (head == null) {
head = node;
tail = node;
} else {
tail.next = node;
node.pre = tail;
tail = node;
}
}

public T popFromHead() {
if (head == null) {
return null;
}
Node<T> node = head;
if (head == tail) {
head = null;
tail = null;
} else {
head = head.next;
head.pre = null;
node.next = null;
}
return node.value;
}

public T popFromBottom() {
if (head == null) {
return null;
}
Node<T> node = tail;
if (head == tail) {
head = null;
tail = null;
} else {
tail = tail.pre;
tail.next = null;
node.pre = null;
}
return node.value;
}

public boolean isEmpty() {
return head == null;
}

}

public static class Node<T> {

public T value;

public Node<T> pre;

public Node<T> next;

public Node(T node) {
this.value = node;
}

}

}

/* 如有错误,欢迎批评指正 */

猜你喜欢

转载自www.cnblogs.com/laydown/p/12791375.html