链表算法二(自定义队列)

利用单向链表自定义队列

实现思想

😗*
准备工作 : 队列需要头部和尾部的指针head和last
第一次插入 : 队里是空第一次插入值让头部和尾部指针同时指向这个元素,因为是第一次插入嘛.所以第一个元素即是头部也是尾部
第N次插入 : 队列里第二次/N次插入值,头部指针不动,尾部指针的下一个元素应该指向插入的元素并且尾部指针需要更新成当前元素
描述苍白无力,看看图吧在这里插入图片描述
取出元素 : 队列中取出元素,其实就是改变head的指针,返回head的val然后head指向head的下一个元素,很好理解。
看图 :

在这里插入图片描述
取出元素潜在BUG : 取出元素时需要判断当前head是否为空,如果为空需要手动释放last,原因是因为当只有一个元素时头部尾部头指向他,他被拿走了,head指向了head.next但是last依旧指向他,导致不能被JVM回收,所以需要手动释放
在这里插入图片描述
到这里大概的思想就是这样了。


代码示例


package linkedlist;

import java.util.Queue;

/**
 * @Author chao
 * @Version V1.0.0
 * @Date 2021/10/26 14:29
 */
public class LinkedListQueue {

    /**
     * 定义一个单向链表结构
     *
     * @param <T> 泛型值
     */
    public static class Node<T> {
        private Node<T> next;
        private T val;

        public Node(T val) {
            this.val = val;
        }
    }

    public static class MyQueue<T> {
        /**
         * 定义头部指针
         */
        private Node<T> head;

        /**
         * 定义尾部指针
         */
        private Node<T> last;

        /**
         * 定义队列大小
         */
        private int size;

        /**
         * 从队列头部插值
         *
         * @param t 元素
         */
        public void offer(T t) {
            // 给新加入的值创建一个节点
            Node<T> cur = new Node<>(t);
            // 判断当前队列中是否存在值
            if (size == 0) {
                // 如果是第一个元素头部指向当前元素
                head = cur;
                // 尾部指向当前元素
                last = cur;
            } else {
                // 不是第一个元素,当前尾部的next指针指向当前元素
                last.next = cur;
                // 当前尾部指针指向当前元素(因为当前元素才是现在的尾部)
                last = cur;
            }
            // 队列数量加一
            size++;
        }

        /**
         * 获取队列中头部元素
         *
         * @return 元素值
         */
        public T poll() {
            // 定义返回对象
            T result = null;
            if (head != null) {
                // 设置返回值为head的val
                result = head.val;
                // 当前元素不为空时,需要把head指针指向下一个元素
                head = head.next;
                // 取出元素后size减一
                size--;
            } else {
                // 当只有一个元素时头部尾部头指向他,他被拿走了,head指向了head.next
                // 但是last依旧指向他,导致不能被JVM回收,所以需要手动释放
                last = null;
            }
            return result;
        }


        /**
         * 当前集合是否为空
         *
         * @return 为空返回true 否则返回false
         */
        public boolean isEmpty() {
            return size == 0;
        }
    }

    public static void main(String[] args) {
        MyQueue<String> queue = new MyQueue<>();
        queue.offer("12");
        queue.offer("13");
        queue.offer("14");
		while(!queue.isEmpty()){
			System.out.print(queue.poll());
		}
      

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值