while
代码看起来不错,但我建议您对您的情况稍作改动
while(prevNode != currentNode && prevNode != NULL)
有两个原因
prevNode
如当前所述,如果我们正在寻找的节点由or指向,您的代码可能会停止prevNode->link
(因此我们将不知道这两个点中的哪一个特定currentNode
- 如果我们想知道,我们将不得不检查if
条件)。通过上面的更改,保证目标节点被存储prevNode
(如果有的话——见下一点)。
- 为了安全起见,最好检查一下
prevNode
is not NULL
。但是,正如 Pavel 提到的,如果currentNode
保证在列表中,则无需进行此测试。
编辑以回应评论
鉴于您不需要知道是否currentNode
在prevNode
orprevNode->link
中,并且由于您想停止(如果可能) on currentNode == prevNode->link
,那么您的原件while
就可以了。然而...
代码中有一个 if 语句可以防止
prevNode
已经为空
似乎您错过了为什么要检查NULL
. 是的,你之前检查它很好,但是我们在循环中检查的原因是在列表中没有NULL
的情况下,所以你最终到达了最后一个节点。大概(如果你像大多数其他链表一样这样做)你最后一个节点的值是. 如果是这样,您当前的代码最终将最终调用which 当然会使您的程序崩溃。这就是为什么你仍然应该检查currentNode
link
NULL
NULL->link
NULL
while(prevNode != NULL && prevNode != currentNode && prevNode->link!=currentNode)
如果您绝对确定它currentNode
会在列表中,那么我想检查也是不必要的,但这确实是一个好习惯。