Java手写队列,细到极致

Java手写队列,最近在学习Aqs,发现里面涉及到很多队列的写法,非常难以理解,于是,专门去学习了队列的Java写法。但是,网上的文章很多只列出一段段代码,其他的需要你自己去理解。
   考虑到一些小伙伴们,可能无法理解其中的意思。所以,我写了一篇细到头发丝的队列文章,每一行都有解释,如果我这样教,你还看不懂,我真的没有办法了。
    队列,先进先出。能理解吗,你就想象一个管道,你从管道进去,后面的人在你后面,前面的人在你前面,废话,我当然知道。队列也是如此,你出来时,前面的人已经出来了,后面的人准备出来。所以,队列有一定的延时。
   下面,开始贴代码

/**
 * @author: Jessica
 * @date: 2022-01-19 15:21
 * @desc:  手写队列,可以用链表实现,也可以用数组实现,这里用链表实现
 **/

public class HandWriteQuene {

    //head--->在offer方法添加的时候,这个属性会指向一个new出来的内部类,ListNode对象
    //tail也是如此
    private ListNode head;

    private ListNode tail;

   private static class ListNode{
       //一个链表里面,需要有3个元素,一个元素表示当前的值,还有一个元素表示前一个节点的全部信息
       //最后一个节点表示后一个节点的全部信息
        private final int value;
        private ListNode pre;
        private ListNode next;

        //将值传入当前节点里面,这里可以先埋一个伏笔
        //我们在添加的时候,第一次添加,如果你是设计师,怎么添加?
        //第二次添加呢?最后一次添加呢?
        public ListNode(int value,ListNode pre,ListNode next){
            this.value=value;
            this.pre=pre;
            this.next=next;
        }
    }

    public void offer(int val){
       //head为空,表示没有数据,那么这个时候,添加一个节点,它既是头节点,也是尾节点
       //第一个节点没有头节点,因为它自己就是头,也没有尾节点
        if (head ==null){
            head=tail=new ListNode(val,null,null);
        }else {
         //第二次添加走到这里,第一个元素加入值,第二个元素加入上一个节点的全部信息,第三个元素依然为null
            tail.next=new ListNode(val,tail,null);
            tail=tail.next;

            //不能这样写,这样写的话,等于把tail全部替换了,之前的tail是 1,null,null
            //现在是2,{1,null,null},null
            //我们期待的是2,{1,null,{2,{1,null,null}}},也就是说,希望第二个节点的pre保存的信息是
            //第一个节点的完整信息 1,null,{2,{1,null,null}}
            //tail=new ListNode(val,tail,null);
        }
    }

    public int take(){
       if (tail ==null){
           throw new RuntimeException("没有节点可以取出");
       }else {
           //需要备份一份给到pop,因为在返回之前,需要把head的pre置为空
           //因为删了一次之后,2的pre为1,需要把2的pre置为空
           ListNode pop=head;
           head=head.next;
           if (head==null){
               tail=head;
           }else {
               head.pre=null;
           }
           return pop.value;
       }
    }

    @Override
    public String toString(){
        StringBuffer stringBuffer = new StringBuffer();
         ListNode cur=head;
         while (cur !=null){ //while(true) 循环取出
             stringBuffer.append(cur.value).append("=>");
             cur=cur.next;
         }
        stringBuffer.append("null");
         return stringBuffer.toString();
    }

    public static void main(String[] args) {
        HandWriteQuene handWriteQuene = new HandWriteQuene();
        handWriteQuene.offer(1);
        handWriteQuene.offer(2);
        handWriteQuene.offer(3);

        System.out.println("toString: " + handWriteQuene);

        System.out.println("take: " + handWriteQuene.take());
        System.out.println("toString: " + handWriteQuene);
        System.out.println("take: " + handWriteQuene.take());
        System.out.println("toString: " + handWriteQuene);
        System.out.println("take: " + handWriteQuene.take());
        System.out.println("toString: " + handWriteQuene);
        System.out.println("take: " + handWriteQuene.take());
        System.out.println("toString: " + handWriteQuene);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesscia ^_^

您的打赏将是我努力的动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值