Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确使用sentinel节点?_C++_Algorithm_Data Structures_Linked List_Sentinel - Fatal编程技术网

C++ 如何正确使用sentinel节点?

C++ 如何正确使用sentinel节点?,c++,algorithm,data-structures,linked-list,sentinel,C++,Algorithm,Data Structures,Linked List,Sentinel,将有多个(密切)相关的问题,而不是一个问题。为了让我们感到安慰,我将对它们进行相应的编号 基于,和讲座,我想我已经理解了sentinel节点背后的想法以及它们在链表中的用法。然而,即使在阅读了这些材料之后,我仍然不清楚一些事情 我得到了一个双链接列表的基本实现(它只存储int值),任务是更改实现,使其使用如下哨兵节点: (尚不允许嵌入图像,抱歉) 问题1 我假设列表的head变量将指向第一个实际节点(哨兵节点之后的节点),而tail变量将仅指向最后一个节点。我是正确的还是头部应该指向哨兵节点?我

将有多个(密切)相关的问题,而不是一个问题。为了让我们感到安慰,我将对它们进行相应的编号

基于,和讲座,我想我已经理解了sentinel节点背后的想法以及它们在链表中的用法。然而,即使在阅读了这些材料之后,我仍然不清楚一些事情

我得到了一个双链接列表的基本实现(它只存储int值),任务是更改实现,使其使用如下哨兵节点:

(尚不允许嵌入图像,抱歉)

问题1 我假设列表的
head
变量将指向第一个实际节点(哨兵节点之后的节点),而
tail
变量将仅指向最后一个节点。我是正确的还是
头部应该指向哨兵节点?我在这里要求的是最佳实践或最标准的方法

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

问题3 当只是迭代而不搜索特定值时(例如,计算节点数,将整个列表输出到控制台),我是否必须像检查nullptr(终止迭代循环)一样检查sentinel节点,或者是否有其他或更智能的方法来执行此操作?

回答1 是的,这是哨兵节点的有效位置<代码>头和尾可以指向数据的实际开始和结束。但是,您的
add
delete
函数需要知道由于sentinel节点而在列表边界处引起的畸变

答复2 是的,这是一种有效的搜索策略,实际上被称为技术

答复3
是的,sentinel节点的目的是让您知道它是sentinel节点。你可以保持一个指向这个sentinel节点的常量指针(或你选择的语言支持的任何东西),以检查你是否在sentinel节点,或者只是在节点上粘贴一个标志。

只是出于好奇,在你的图像中,为什么列表的最后一个节点没有指向sentinel的下一个ptr?这是个好问题,我甚至没有注意到(我不是它的创建者)。我会自动假设最后一个元素的“下一个”是sentinel节点和“prev”sentinel节点的属性将是最后一个元素。因此它将形成一个圆圈。好的,那么在这种情况下,这不仅仅是一个双链接列表,但引入sentinel将使其成为一个修改的双链接列表。答案3-向常规节点结构/类添加一个标志,例如
isSentinel
,并检查是否存在该标记?老实说,我“我更喜欢指针方法,因为它可以减少假设,但是,是的,如果这不可能,那么在sentinel节点是一类特殊的常规节点的情况下,像您建议的那样的标志将起作用。指针方法在我的情况下似乎更容易,谢谢。甚至可以在不循环列表的情况下有效地使用单个sentinel节点吗?我不这样认为,但也许我错了。你能详细说明一下吗?如果你的哨兵节点位于列表的开头/结尾,它的目的是通知你,当你通过它时,你已经成功地“循环”我想说的是,哨兵最有效地达到了它的目的,你当时想的是什么?我的意思是,从技术上说,你可以,但你的哨兵的有效性将大大降低,你有两种类型的尾声要检查。如果你的哨兵坐在开始,但不是在最后,那么你必须检查对于结尾处的
null
,如果sentinel位于末尾,则相反。理想情况下,本文中的sentinel策略是检查null的替代品,因此我不建议这样做