C++ 在C+中遍历单链表+;

C++ 在C+中遍历单链表+;,c++,pointers,linked-list,singly-linked-list,C++,Pointers,Linked List,Singly Linked List,我想知道是否可以遍历这样的链接列表: P>在尝试在单链表中找到当前节点之前的节点时,C++中有可能做到这一点吗? 我试图在学校作业的控制台应用程序中实现类似的东西,因此假设我不能使用任何花哨的东西,比如boost libraries/list/任何让生活更轻松的东西,等等。因此,基本上,我只有相当原始的数据类型和库可供使用。这应该可以正常工作。您试过了吗?您可能希望确保prevNode->link也不是空引用,以防currentNode未实际链接。您甚至可以: while (prevNode

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

<> P>在尝试在单链表中找到当前节点之前的节点时,C++中有可能做到这一点吗?
我试图在学校作业的控制台应用程序中实现类似的东西,因此假设我不能使用任何花哨的东西,比如boost libraries/list/任何让生活更轻松的东西,等等。因此,基本上,我只有相当原始的数据类型和库可供使用。

这应该可以正常工作。您试过了吗?

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

您甚至可以:

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

但是您所拥有的看起来很好。

代码看起来很好,但是我建议您在状态下对
进行一个小的更改

while(prevNode != currentNode && prevNode != NULL)
有两个原因

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

根据评论进行编辑

假设您不需要知道
currentNode
是否在
prevNode
prevNode->link
中,并且由于您想在
currentNode==prevNode->link
上停止(如果可能),那么您原来的
就可以了。然而

在更高的位置有一个if语句 防止
prevNode
不为空 已经

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

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

如果您完全确定
currentNode
将在列表中,那么我想检查也没有必要,但这确实是一个好习惯。

代码将遍历列表的某个部分,但哪一部分取决于列表的链接方式。如果它从head->tail(读:head节点链接到指向tail的节点),那么您将遍历列表,从随机位置开始遍历到尾部。如果链接是head一件小事,我会按照发布的代码进行更改(除了在其他答案中讨论的如果currentNode不在列表或其他错误处理中,则可能会从列表末尾运行)当while循环完成时,您不知道
prevNode
prevNode->link
是否指向
currentNode
。这不是一个很大的问题(因为你可以很容易地测试它),但在我看来,最好是在搜索之前对这个特殊情况进行测试,所以很明显这是一个特殊的情况。

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

  • 发生了什么事
    randomNode
    等于
    firstNode
    ?你还回什么?你应该归还什么
  • randomNode
    是列表中的最后一个节点时会发生什么
  • randomNode
    NULL
    时会发生什么
  • randomNode
    不在列表中时会发生什么情况
现在,并不是所有这些情况都适用,这取决于您是否了解
randomNode
,其中一些可能并不重要。但它们都值得思考


如果你仔细考虑所有这些问题,就会有一个简单而优雅的解决方案来处理它们。

为什么你想试试看它是如何工作的?假设您总是至少有一个节点,并且
randomNode
保证是列表中的有效节点(因此您永远不会“跑完”)。那么您到底想做什么?在链接列表中搜索节点?while条件看起来有点奇怪…为什么要测试prevNode!=当前节点?此外,列表是否可以为空?currentNode是否可能不在列表中?@Pavel:它已经在我的代码中了,但我还没有到可以轻松测试的地方。我想我会在这里检查一下,看看它是否有逻辑意义,是否至少有可能。我所关心的真正问题是,就
prevNode=prevNode->link而言,这段代码是否符合犹太教教义开始@阿什温:我的姿势你们可以称之为搜索,但我计划使用这个循环来帮助我在两个节点之间插入一个新节点@吉姆:我正在测试,如果
randomNode
等于
firdtNode
,那么它前面就没有节点了。如果currentNode保证在列表中(从描述来看,它似乎是),循环将始终在列表结束之前终止。我之所以有这样的条件,是因为代码中更高的if语句阻止
prevNode
已经为空,所以基本上我想确保
prevNode
等于当前节点或
currentNode
之前的节点,这永远是第一位。是和否。它在我的代码中,但没有
while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)
[head]<->[0...N Nodes]<->[Tail]