使用链表实现队列

要满足队列先入先出的特征需要2个指针,一个指向队头元素,一个指向队尾元素。
当入队列时,在链表的表尾插入元素;当出队列时,在链表的表头删除元素。对于单链表而言,删除当前指针所指的元素是不太好实现的(删除尾结点不太好实现),因此将出队列操作实现为在链表的表头删除元素。

tips:单链表删除表头元素易实现,删除表尾元素需要遍历找到表尾结点的前驱结点

在jdk中,java.util.LinkedList 类就同时实现了栈和队列的功能。push/pop方法实现了入栈、出栈,offer/poll实现了入队列、出队列。

使用链表实现队列的代码如下:

public class Queue<Item> {
    private Node first;
    private Node last;
    private int n;


    public void enqueue(Item item) {
        //在链表尾部插入结点
        Node oldLast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if (isEmpty()) {
            //队列插入第一个元素
            first = last;
        } else {
            oldLast.next = last;
        }
        n++;
    }

    public Item dequeue() {
        //在链表表头删除结点,(对单链表而言,不好删除表尾结点)
        Item item = first.item;
        first = first.next;
        n--;
        if (isEmpty()) {
            //删除队列中最后一个元素
            last = null;
        }
        return item;
    }

    public boolean isEmpty() {
        return n == 0 ? true : false;
    }

    public int size() {
        return n;
    }


    class Node {
        Node next;
        Item item;
    }

    public static void main(String[] args) {
        Queue<Integer> queue = new Queue<>();
        queue.enqueue(10);
        queue.enqueue(100);
        System.out.println(queue.size());
        System.out.println(queue.dequeue());
        System.out.println(queue.size());
        queue.dequeue();
        System.out.println(queue.size());
        System.out.println(queue.dequeue());

    }
}

参考:

原文:https://www.cnblogs.com/hapjin/p/15999999.html

posted @ 2022-03-13 11:58  大熊猫同学  阅读(522)  评论(0编辑  收藏  举报