这两种写法的区别在于它们的判定条件不同,主要体现在是否显式检查当前指针 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,可以直接用这种写法。 - 更简洁,但潜在风险是:如果
cur是NULL,会直接解引用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) |
|---|---|---|
| 安全性 | 更安全,避免空指针解引用 | 较低,如果 cur 是 NULL 会崩溃 |
| 适用性 | 用于可能包含空指针的情况 | 用于逻辑上保证 cur 非空的情况 |
| 简洁性 | 稍显冗长 | 更简洁 |
- 如果逻辑上不能确保
cur一定非空,使用while (cur != NULL && cur->next != NULL)。 - 如果逻辑上已明确
cur不可能为 NULL(如链表至少有一个节点),可以使用while (cur->next != NULL)简化代码。