繁体   English   中英

在C ++中遍历单个链接列表

[英]traversing a singly linked list in C++

我想知道是否可以遍历这样的链表:


currentNode = randomNode;//where randomNode may or may not = firstNode
prevNode = firstNode;
while(prevNode != currentNode && prevNode->link != currentNode)
{
    prevNode = prevNode->link;
}

当我尝试在单链列表中的currentNode之前找到节点时,是否可以在C ++中执行此操作?

我试图在学校应用程序的控制台应用程序中实现类似这样的功能,所以假设我不能使用任何类似的东西,例如boost库/列表/任何使生活更轻松的东西,等等。因此,基本上,我只有相当原始的数据类型,我可以使用的图书馆。

您可能要确保prevNode-> link也不为空引用,以防currentNode实际未链接。

那应该很好。 你尝试过了吗?

代码看起来不错,但我建议对您的while条件进行些微更改

while(prevNode != currentNode && prevNode != NULL)

有两个原因

  • 如当前所述,如果您要查找的节点由prevNodeprevNode->link指向,则您的代码可能会停止(因此,我们不知道指向currentNode的两个点中的哪一个特别重要-如果我们想知道,我们将必须检查if条件)。 通过上述更改,可以确保将目标节点存储在prevNode (如果有的话,请参阅下一点)。
  • 为了安全起见,最好检查prevNode不为NULL 但是,正如Pavel提到的,如果可以保证currentNode在列表中,则不需要进行此测试。

编辑以回应评论

鉴于您不需要知道currentNode是在prevNode还是prevNode->link ,并且由于您想(如果可能)在currentNode == prevNode->link上停止,那么您的原始while很好。 然而...

在代码中较高的位置有一个if语句,它防止prevNode已经为null

似乎您错过了为什么要检查NULL的要点。 是的,您之前进行过检查很好,但是在循环中进行NULL检查的原因是currentNode 不在列表中,因此您最终到达了最后一个节点。 大概(如果您像大多数其他链接列表一样执行此操作),最后一个节点的link值为NULL 如果是这样,您当前的代码最终将最终调用NULL->link ,这当然会使您的程序崩溃。 这就是为什么您仍然应该检查NULL

while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)

如果您完全确定 currentNode会在列表中,那么我检查也是不必要的,但这确实是个好习惯。

该代码将遍历列表的某些部分,但是哪一部分取决于列表的链接方式。 如果它从头到尾(读:头节点链接到一个节点,该节点链接到尾部),则您将从随机位置开始遍历列表到尾部。 如果链接是head <-tail,那么您将从随机位置遍历到head。 无论哪种情况,您都不会触摸列表中的所有节点。

上面所有这些都假定这样的一些链接列表:

[head]<->[0...N Nodes]<->[Tail]

链接可以是任何一种方式。

另外,您可以链接头节点和尾节点并创建循环链接列表。 在这种情况下,可以通过简单地遍历直到返回原始节点来访问所有节点。

确保考虑所有可能的边缘情况:

  • randomNode等于firstNode会发生什么? 你还回来什么? 应该还什么?
  • randomNode是列表中的最后一个节点时会发生什么?
  • randomNodeNULL时会发生什么?
  • randomNode不在列表中时会发生什么?

现在,并不是所有这些情况都适用,这取决于您是否对randomNode有所了解,其中有些可能是微不足道的。 但是他们都值得考虑。

如果您非常仔细地考虑所有这些,那么有一个简单而优雅的解决方案可以处理所有这些问题。

您甚至可以拥有:

while (prevNode && prevNode != currentNode)
    prevNode = prevNode->link;

但是您所拥有的看起来不错。

我要对所发布的代码进行更改(除了在其他答案中讨论的可能性之外,如果currentNode不在列表中或其他错误处理,则在列表末尾运行)的一小件事是,当while循环完成时您不知道prevNodeprevNode->link指向currentNode 这不是一个大问题(因为您可以轻松地对其进行测试),但是在我看来,最好在搜索之前针对这种特殊情况进行测试,因此很明显这是一种特殊情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM