我想确定链表的长度是奇数还是偶数。
我有一个指针以两倍的速度移动。如果链表的长度是偶数,则快速指针最终将变为空。如果链表的长度为奇数,则快速指针将到达末尾;
//Method 1 Works
int isLengthEvenOrOdd(struct Node* head){
Node *fast;
fast=head;
if(head==NULL)
return 0;
while(fast && fast->next!=NULL){
fast=fast->next->next;
}
if(fast==NULL)
return 0;
else
return 1;
}
//Method 2 Segmentation Fault
int isLengthEvenOrOdd(struct Node* head){
Node *fast;
fast=head;
if(head==NULL)
return 0;
while(head && fast->next!=NULL){
fast=fast->next->next;
}
if(fast==NULL)
return 0;
else
return 1;
}
有人可以告诉我下面的代码为什么错误吗?
while(head && fast->next!=NULL){
fast=fast->next->next;
}
答案 0 :(得分:3)
仔细查看这两个说明(我假设两者之间什么也没有)
head
while()
在fast->next
条件下永远不会为NULL,因此您始终只检查fast
。到达最后时,room-coroutines
为NULL,您会遇到细分错误。
建议,不要以错误的方式使用它,获得一个不错的IDE(有很多免费的),并学习如何使用调试器。如果您想成为更坚强的人,请继续使用文本编辑器和gdb或您喜欢的任何调试器。您的生产力将会提高。
答案 1 :(得分:0)
让我们看一下这段代码:
while(head && fast->next!=NULL){
fast=fast->next->next;
}
头部永远不会为空
现在说列表是 1-> 2-> 3-> 4->空 头 快速 第一次迭代后 1-> 2-> 3-> 4->空 头 快速
现在根据代码看 fast-> next不为null,因此会进入循环
and sets fast to "fast->next-> next"
which makes
fast = null as
1 -> 2 -> 3 -> 4 -> null
head
fast
因此,当您尝试访问null的“ next”时,您会遇到分段错误
代码1之所以起作用,是因为条件为“快速&&快速->下一个”
由于首先要检查快速是否存在,所以您从未尝试访问不存在的内容。代码仅在fast = null时退出循环,这在Code2中没有发生