将有多个(密切)相关的问题,而不是一个单一的问题。为了我们的安慰,我将相应地对它们进行编号。
基于这篇维基百科文章、这个问题和讲座,我想我已经理解了哨兵节点背后的概念以及它们在链接列表中的用法。然而,即使在阅读了这些材料之后,我仍然不太清楚一些事情。
我得到了一个双链接列表的基本实现(它只存储int值),任务是更改实现,因此它使用了一个哨兵节点,如下所示:
说明性图像 (不允许嵌入图像,对不起)
问题1
我假设列表中的head变量将指向第一个实际节点(在哨兵节点之后的那个节点),而tail变量只指向最后一个节点。我是正确的,还是head应该指向哨兵节点?我在这里要求的是最佳实践或最标准的方法。
问题2
我理解,在搜索列表中的值时,我不再需要检查nullptr,因为我使用的是哨兵节点。由于由于哨兵节点的作用,列表基本上形成了一个圆圈,所以我必须在遍历整个列表并到达它之后终止它。我是否可以将所寻找的值放在哨兵节点中,并将其用作一个类型的前哨值,然后检查循环结束时是否从哨兵节点返回结果?一些消息来源声称,哨兵节点根本不应该存储任何值。我的方法正确/合理有效吗?
问题3
当简单地迭代而不是搜索特定的值(例如,计数节点,将整个列表输出到控制台)时,我是否必须以与nullptr (终止迭代循环)相同的方式检查哨兵节点,还是有一种不同的或更聪明的方法来完成这个任务?
发布于 2018-03-29 22:36:46
答案1
是的,这是一个对哨兵节点有效的位置。head和tail可以指向数据的实际开始和结束。但是,您的add和delete函数需要知道由于哨兵节点而在列表边界造成的异常。
答案2
是的,这是一种有效的搜索策略,实际上被称为开罗大象技术
答案3
是的,哨兵节点的目的是让你知道它是哨兵节点。您只需维护一个指向此哨兵节点的常量指针(或您的选择支持的任何指针),以检查您是否位于哨兵节点,或者只需在节点中添加一个标志。
https://stackoverflow.com/questions/49565823
复制相似问题