使用链表实现优先级队列
到目前为止,我们看到的链表只使用了一个值,即节点数据。现在我们需要传递另一个值,即优先级。为此,我们需要改变 ListNode
的实现:
Unresolved include directive in modules/ROOT/pages/ch04/ch4-10.adoc - include::example$Chapter04/8.php[]
现在,数据和优先级都成为了节点的一部分。为了在插入操作中考虑优先级,我们还需要修改 LinkedList
类中的 insert()
实现。以下是修改后的实现:
Unresolved include directive in modules/ROOT/pages/ch04/ch4-10.adoc - include::example$Chapter04/8.php[]
正如我们所看到的,我们的插入方法已被修改为在插入操作过程中同时获取数据和优先级。像往常一样,第一个过程是创建一个新节点并增加节点数。插入操作有三种可能,如下所示:
-
列表为空,因此新节点是第一个节点。
-
列表不是空的,但新项目的优先级最高,所以。所以它成为第一个节点,而之前的第一个节点紧随其后。
-
列表不是空的,优先级也不是最高的,因此会将新节点插入列表内部,或者可能是在列表的顶部。在列表内部,或者在列表末尾。
在我们的实施过程中,我们考虑了所有三种可能性,三种事实。因此,我们总是将优先级最高的项目放在列表的开头。现在,让我们用这段新代码来运行 AgentQueue
的实现,如下例所示:
Unresolved include directive in modules/ROOT/pages/ch04/ch4-10.adoc - include::example$Chapter04/8.php[]
如果没有优先级,那么队列应该是 Fred
、John
、Keith
、Adiyan
和 Mikhael
。但由于我们在队列中加入了优先级,所以输出结果是:
Adiyan
Keith
John
Mikhael
Fred
由于 Adiyan
的优先级最高,因此它被置于队列的起始位置,尽管它被插入队列的第四位。