C语言中如何检查链表是否为空?指针初始化后判断异常求助
链表判空异常输出的常见排查方向
嘿,我来帮你捋捋这个问题!链表判空时出现异常输出,大概率是指针初始化或者判空逻辑踩了坑,我给你列几个最常见的错误场景,你可以对照自己的代码逐一排查:
野指针初始化:如果你的指针只是声明了但没初始化(比如
ListNode* ptr;),那它会指向一块随机的内存地址,这时候用ptr == NULL判空完全不靠谱——因为这个野指针几乎不可能刚好等于NULL,程序会出现不可预期的输出。正确的做法是初始化时直接设为NULL(C里ListNode* ptr = NULL;,C++里用nullptr)。混淆哨兵节点和普通链表头:要是你用了带哨兵节点的链表(就是一个不存数据的空节点,真正的链表从它的
next开始),那判空的逻辑应该是检查head->next == NULL,而不是直接判head == NULL——毕竟哨兵节点本身是一直存在的,永远不会是NULL,要是搞错了就会得到相反的结果。判空逻辑写反:这个说出来有点好笑,但真的很容易犯——比如本来想判断空链表,结果写成了
if (ptr != NULL)然后输出“链表为空”,那自然会得到和预期完全相反的异常输出。指针被意外修改:有没有可能在初始化指针之后,不小心对它做了移动操作?比如提前执行了
ptr = ptr->next;,这时候你再判空,检查的已经不是原来的链表头了,结果当然不对。
给你贴两个正确的判空示例参考:
普通链表(无哨兵节点)的正确写法
#include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode* next; } ListNode; int main() { // 空链表时头指针直接初始化为NULL ListNode* head = NULL; // 正确判空逻辑 if (head == NULL) { printf("链表为空\n"); } else { printf("链表不为空\n"); } return 0; }
带哨兵节点的链表判空写法
#include <stdio.h> #include <stdlib.h> typedef struct ListNode { int val; struct ListNode* next; } ListNode; int main() { // 创建哨兵节点,空链表时它的next为NULL ListNode* head = (ListNode*)malloc(sizeof(ListNode)); head->next = NULL; // 判空要检查哨兵节点的next if (head->next == NULL) { printf("链表为空\n"); } else { printf("链表不为空\n"); } // 记得释放内存避免泄漏 free(head); return 0; }
要是对照完还是没找到问题,把你的代码贴出来,我帮你精准定位!
内容的提问来源于stack exchange,提问作者ssrvz
相关产品推荐
相关产品推荐

