持续创作,加速成长!这是我参与「掘金日新计划 · 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()
方法。
天天学习,加速成长!
希望与各位一起变得越来越强!