首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在for循环定义中的C++指针行为与在for循环中的增量时的差异

在for循环定义中的C++指针行为与在for循环中的增量时的差异
EN

Stack Overflow用户
提问于 2022-01-19 20:02:30
回答 1查看 48关注 0票数 -1

我进入了一个leetcode问题 (Floyd的链表周期检测算法),在该算法中,我注意到指针状态上的一个奇怪行为。当我在for循环中更改指针状态时,程序将正确执行(指针状态移动到正确的状态):

代码语言:javascript
运行
复制
ListNode *detectCycle(ListNode *head) {
        
        if(!head or !head->next)
            return nullptr;
        
        ListNode *slow, *fast;
        
        for(slow = head, fast = head; fast && fast->next;)
        {
            slow = slow->next, fast = fast->next->next; // This hops the pointers correctly

            if(slow == fast)
            {
                slow = head;
                while(slow != fast)
                {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow;
            }
        }
        return nullptr;
    }

但是,当我在for循环定义中状态更改slowfast时,状态更改是错误的,程序没有给出正确的输出。

代码语言:javascript
运行
复制
ListNode *detectCycle(ListNode *head) {
        
        if(!head or !head->next)
            return nullptr;
        
        ListNode* slow, *fast;
        
        for(slow = head, fast = head; fast && fast->next; slow = slow->next, fast=fast->next->next) // Pointers dont hop correctly
        {
            if(slow == fast)
            {
                slow = head;
                while(slow != fast)
                {
                    slow = slow->next;
                    fast = fast->next;
                }
                return slow;
            }
        }
        return nullptr;
    }

我不知道是什么导致了这一切。在我看来,增加for循环定义中的指针与立即在for循环中递增指针应该是相同的。有人能洞察为什么循环中的增量指针和for循环签名中的增量指针会导致不同的行为吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-19 20:33:47

一个

代码语言:javascript
运行
复制
for (init-statement; condition; iteration-expression)
{
    dostuff();
}

映射到

代码语言:javascript
运行
复制
{
    init-statement
    while ( condition ) 
    {
        dostuff();
        iteration-expression ;
    }
}

所以我们得到

代码语言:javascript
运行
复制
{
    slow = head, fast = head;
    while (fast && fast->next)
    {
        slow = slow->next, fast = fast->next->next; 
        dostuff(); // for example purposes only. Not really replacible with a function 
    }
}

代码语言:javascript
运行
复制
{
    slow = head, fast = head;
    while (fast && fast->next)
    {
        dostuff();
        slow = slow->next, fast=fast->next->next;
     }
}

在第一个版本中,slowfast总是在dostuff()之前被更新。

在第二个过程中,dostuff发生在slowfast更新之前,因此在dostuff中使用的slowfast的值在第一个循环迭代中会有所不同。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70777047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档