如何正确使用哨兵节点?

时间:2018-03-29 22:17:46

标签: c++ algorithm data-structures linked-list sentinel

将会有多个(密切)相关的问题,而不是一个问题。为了我们的安慰,我会相应地为他们编号。

基于this Wikipedia articlethis question和讲座,我想我已经理解了前哨节点背后的想法及其在链表中的用法。然而,即使阅读了这些材料,我仍然不清楚一些事情。

我得到了一个双向链表的基本实现(它只存储了int值),任务是更改实现,所以它使用这样的sentinel节点:

Illustrative image(暂时不允许嵌入图片,抱歉)

问题1

我假设列表的head变量将指向第一个真实节点(在前哨节点之后的那个),tail变量将简单地指向最后一个节点。我是正确的还是head指向哨兵节点?我在这里要求最佳实践或最标准的方法。

问题2

据我所知,在列表中搜索值时,我不再需要检查nullptr,因为我使用的是sentinel节点。由于listine节点基本上形成了一个圆,所以我必须在遍历整个列表并到达它之后终止它。我可以通过将我要查找的值放在sentinel节点中并将其用作排序的sentinel值,然后检查循环结束时是否从sentinel节点返回结果吗?一些消息来源声称,前哨节点根本不应存储任何值。我的方法是否正确/合理有效?

问题3

当简单地迭代而不是搜索特定值时(例如计算节点,将整个列表输出到控制台中),我是否必须像检查nullptr那样检查sentinel节点(以终止迭代)循环)还是有不同的或更聪明的方法吗?

1 个答案:

答案 0 :(得分:3)

答案1

是的,这是sentinelnode的有效位置。 headtail可以指向数据的实际开头和结尾。但是,您的adddelete函数需要知道凭借前哨节点在列表边界处引起的像差

答案2

是的,这是一种有效的搜索策略,实际上称为Elephant in Cairo技术

答案3

是的,Sentinel节点的目的是让您知道它是前哨节点。您可以只维护一个常量指针(或者您选择支持的任何内容)到此Sentinel节点,以检查您是否位于Sentinel节点或只是在节点中粘贴一个标志。