C++ 在C+中遍历单链表+;
我想知道是否可以遍历这样的链接列表: <> P>在尝试在单链表中找到当前节点之前的节点时,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
我试图在学校作业的控制台应用程序中实现类似的东西,因此假设我不能使用任何花哨的东西,比如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]