单链表与队列和栈

单链表与队列和栈

使用单链表实现队列

队列是一个先进先出的数据结构,它包括进队、出队、获取队列大小等功能。

代码:

/**
 * 使用单链表实现队列
 * 队列是一个先进先出的数据结构,有进队列出队列,计算队列的大小等
 */
public class LinkedListImplementsQueue {
    //1.定义一个单链表的节点信息类
    public static class Node<V>{
        public V value;
        public Node<V> next;
        public Node(V v){
            value = v;
            next = null;
        }
    }

    //2.定义一个队列信息类
    public static class MyQueue<V>{
        //1.队列的头
        private Node<V> head;
        //2.队列的尾
        private Node<V> tail;
        //3.队列的大小
        private int size;
        public MyQueue(){
            head = null;
            tail = null;
            size = 0;
        }

        //1.判断队列是否为空
        public boolean isEmpty(){
            return size == 0;
        }
        //2.队列大小
        public int size(){
            return size;
        }
        //3.节点入队
        public void offer(V v) {
            //1.首先应该定义一个节点来接受新入队列的节点
            Node<V> current = new Node<>(v);
            //2.如果队列的尾部为空说明此时该队列是一个空队列,那么就让头部和尾部都指向该节点
            if(tail == null){
                head = current;
                tail = current;
            }else {
                //如果队列不为空
                tail.next = current;
                tail = current;
            }
            size++;
        }
        //4.节点出队列
        public V poll() {
            //首先定义一个变量接收出队列节点的值
            V ans = null;
            //出队列是从头部开始出因为队列是先进先出
            if(head != null){
                //首先记录头节点的值
                ans = head.value;
                //然后head向下走 不用管之前头节点的指针因为当它没有引用的时候jvm会自动回收
                head = head.next;
                //然后大小减一
                size--;
            }
            //最后返回出节点的值
            return ans;
        }
        //5.获取当前头节点的值
        public V peek() {
            V ans = null;
            if (head != null) {
                ans = head.value;
            }
            return ans;
        }
    }
}

单链表实现栈

栈是一个先进后出的数据结构,它包括进栈、出栈、获取栈的大小等功能。

代码:

/**
 * 使用单链表实现栈,栈是一个先进后出的数据结构
 */
public class LinkedListImplementsStack {
    //1.定义一个单链表的节点信息类
    public static class Node<V>{
        public V value;
        public Node<V> next;
        public Node(V v){
            value = v;
            next = null;
        }
    }
    //2.定义一个栈的信息类
    public static class MyStack<V> {
        private Node<V> head;
        private int size;
        public MyStack(){
            head = null;
            size = 0;
        }

        //1.栈的大小是否为空
        public boolean isEmpty(){
            return size == 0;
        }
        //2.栈的大小
        public int size(){
            return size;
        }
        //3.进栈
        public void push(V v) {
            //1.首先定义一个节点用来接收进栈节点信息
            Node<V> current = new Node<>(v);
            //如果栈为空就将头节点指向此时进栈的节点
            if (head == null) {
                head = current;
            }else {
                //首先将新进入节点的next指向原来的head
                current.next = head;
                //再将原来的head指向新进入的节点
                head = current;
            }
            //最后size加一
            size++;
        }
        //4.出栈
        public V pop() {
            //1.首先定义一个变量用来接收出栈节点的值
            V ans = null;
            //2.当head!=null的时候进行出栈
            if(head!=null){
                //先记录head节点的值
                ans = head.value;
                //然后head指向head的下一个节点
                head = head.next;
                //最后size--
                size--;
            }
            //最后返回ans
            return ans;
        }
        //5.获取栈顶节点的值
        public V peek() {
            return head != null ? head.value : null;
        }
    }
}
posted @   卬啵哩啵bo  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示