package Doublechaintable;
/**
* @author 真他喵的学不动咯
* @create 2022-08-11--19:06
*/
public class Doublechain { //双端链表
//内部类
public static class Node<V>{
//属性
public V value;
public Node<V> last; //双向链表,last\next
public Node<V> next;
//构造器
public Node(V v){
value=v;
last=null;
last=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; //cur的下一个是头 cur
head.last=cur; //头的下一个是cur结点 ⬇
head=cur; //把头变了,头变成新节点 head
}
size++; //长度+1
}
//从尾入
public void pushTail(V value){
Node<V> cur =new Node<>(value);
if (head==null) {
head=cur;
tail=cur;
}else{ //从尾入:
tail.next=cur; //尾巴的下一个是cur结点 cur
cur.last=tail; //cur的上一个是尾巴 ⬆
tail=cur; //把尾巴变了,尾变成新节点 tail
}
size++;
}
//从头弹出
public V pollHead(){
V ans=null;
//边界条件
if (head==null){ //如果没元素,直接返回null
return ans;
}
//如果执行到这里,说明一定有元素,既然弹出,那就可以不考虑其他因素把size--
size--;
ans=head.value; //ans设置为头结点的值
if (head==tail){ //如果头等于尾,那就是只有一个元素
head=null; //弹出以后就没了
tail=null;
}else{ //多于1个元素
head=head.next;
head.last=null;
}
return ans;
}
//从尾弹出
public V poolTail(){
V ans=null;
//边界条件
if (head==null){ //如果头是空的直接返回空,此时说明所有元素都弹出了
return ans;
}
//如果执行到这里,一定有元素出去了,size-1
size--;
ans=tail.value;
if (head==tail){
head=null;
tail=null;
}else{
tail=tail.last;
tail.next=null;
}
return ans;
}
}
}
}
//双端链表
最新推荐文章于 2024-06-05 17:22:57 发布