找出链表是偶数还是奇数长度

时间:2019-06-20 10:16:37

标签: c++ segmentation-fault

我想确定链表的长度是奇数还是偶数。

我有一个指针以两倍的速度移动。如果链表的长度是偶数,则快速指针最终将变为空。如果链表的长度为奇数,则快速指针将到达末尾;

    //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;
     }

2 个答案:

答案 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中没有发生