数据结构10:队列(05)

123 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第12天,点击查看活动详情

基于链表的队列实现

在前面几篇中,我们实现了基于顺序表的队列,并为延长其使用设计了循环队列。但在设计过程中,我们同样发现了基于队列实现的种种缺点,如:因顺序表限制难以确定队列状态、使用空间僵硬不灵活等。

从本篇开始,将为大家介绍基于链式存储结构的队列实现

public class queueList{
    Node head;
    Node end;
    public void add(int value);
    public int pop();
}

首先我们先构造出一个链表,并逐步按照队列的要求逐一实现链表的add()pop()方法。

开始先构建队列的初始化方法方法,因为在链表中必定要存在一个头节点,所以在创建队列对象时将头指针尾指针都指向这个头节点

public queueList()
{
    this.head = new Node();
    this.end = this.head;
}

我们先来设计入队方法。当我们向队列中插入元素时,根据队列的定义我们只需要操作尾指针。所以创建链表的操作就是为end尾指针添加一个新的后继元素,然后为保持end始终为队列的末位元素,令其向后移动。

public void add(int value)
{
    this.end.addNext(new Node(value));
    this.end = this.end.next;
}

设计完添加方法后,现在开始设计队列的出队方法。当我们从一个队列中取出元素时,我们不止是要获取到当前队头元素的值,同时还要将该元素从队列中删除。根据队列的定义,出队方法我们也只需要操作头指针就好了。

public int pop()
{
    Node valueNode = this.head.next;
    this.head.next = valueNode.next;
    return valueNode.value;
}

我们先创建一个临时指针valueNode用以保存队头元素,然后我们修改头指针的后继节点,将原队头元素从队列中 "摘" 出来,然后再将valueNode的value返回给调用者。这样我们设计好了队列的两个基本方法:入队add()和出队pop()

小结

本篇我们开始着手设计基于链式存储的队列,并初步设计了它的入队add()方法和出队pop()方法。

天天学习,加速成长!

希望与各位一起变得越来越强!