数据结构11:队列(06)

141 阅读2分钟

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

基于链表的队列实现

在上篇中,我们着手设计了基于链式存储结构实现的队列。我们为其设计的入队方法add()和出队方法pop()都按照队列的要求:使用队列存取数据元素时,数据元素只能从表的一端进入队列,另一端出队列。

这个队列看上去已经是一个合格的链表队列了,但是它还有着一些缺陷——当我们使用pop()方法出队队列中的最后一个元素时,队列会将尾指针出队,而一旦出现这种情况所有从尾指针入队的元素则再不能被头指针出队。 因为尾指针已经被 “出队” 了,尾指针已不再指向队列中的元素了。

所以我们要稍微修改一下出队方法pop(),让队列在出队最后一个元素时,将尾指针保存下来。

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

在出队时我们进行一个判断,看下被出队元素是不是最后一个元素(也就是我们的尾指针),如果是的话我们将尾指针回收回来,这样就可以规避掉队列出队时将尾指针删除导致的问题了。

由此我们可以发现,相比于循环队列,由链表实现的队列很轻松就能判断此时的队列是不是一个空队列,只需要判断队列的头尾指针是不是相等。同样的,若是我们需要快速制空一个链表队列,我们只需要修改head.nextend就好了。而因为链表的特殊性,所以由链表实现的队列不需要考虑队列是不是已经满了。

public boolean isEnpty()    // 查看这是不是一个空队
{
    return this.head == this.end;
}
​
public void setNull()   // 将队列置空
{
    this.end = this.head;
    this.head.next = null;
}

小结

本篇中我们完善了上篇中设计的基于链表实现的队列,并通过链表的特点设计了isEmpty()setNull()方法。

天天学习,加速成长!

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