while (cur != NULL && cur->next != NULL)与 while (cur->next != NULL)区别

215 阅读1分钟

这两种写法的区别在于它们的判定条件不同,主要体现在是否显式检查当前指针 cur 是否为 NULL

1. while (cur != NULL && cur->next != NULL)

这个条件分两部分:

  • cur != NULL:确保当前节点 cur 本身不是空指针。

  • cur->next != NULL:确保当前节点的 next 指针不是空指针。

  • 如果代码逻辑允许 cur 一开始就是 NULL(例如可能传入空链表的情况下),使用这种写法是更安全的,因为它显式检查了 cur 是否为 NULL

  • 避免对空指针解引用。只有在 cur 确定不为 NULL 时,才会访问 cur->next

LinkNode* cur = head;
while (cur != NULL && cur->next != NULL) {
    // 此处安全访问 cur 和 cur->next
    cur = cur->next;
}

2. while (cur->next != NULL)

这个条件假设当前节点 cur 一定不为 NULL,只检查当前节点的 next 指针是否为 NULL

  • 如果代码逻辑能够保证在进入循环前 cur 一定不为 NULL,可以直接用这种写法。
  • 更简洁,但潜在风险是:如果 curNULL,会直接解引用 cur->next,导致程序崩溃(运行时错误)。
LinkNode* cur = head;  // 假设 head 一定不为 NULL
while (cur->next != NULL) {
    // 此处安全访问 cur->next
    cur = cur->next;
}

主要区别

特性while (cur != NULL && cur->next != NULL)while (cur->next != NULL)
安全性更安全,避免空指针解引用较低,如果 curNULL 会崩溃
适用性用于可能包含空指针的情况用于逻辑上保证 cur 非空的情况
简洁性稍显冗长更简洁
  • 如果逻辑上不能确保 cur 一定非空,使用 while (cur != NULL && cur->next != NULL)
  • 如果逻辑上已明确 cur 不可能为 NULL(如链表至少有一个节点),可以使用 while (cur->next != NULL) 简化代码。