双向链表求中间值,意外作对了,但不理解


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */


struct ListNode* middleNode(struct ListNode* head)
{
    int i = 0;
    struct ListNode * p = head;
    struct ListNode *q = head;
    while(p)
    {
        p = p->next;
        i++;
    }
    int result = i/2;


    while(result--)
    {
        q = q->next;
    }
    return q;

  //力扣展现的就这么多 
}

我知道有更好的办法,但是这个基础方法都还没有理解。
就像图中所提及的,我认为我返回的第二个结点为什么却返回的第三个节点,我想知道我哪步的理解错了,为什么返回的不是第二个而是第三个
(我在本问题中要的不是正确答案 单纯的希望有人来修正我的逻辑错误,万分感谢)

img

while(result--) 先判断后减减 ,共执行2次,1,2,3,4,5 移动两次,q指向了3

另外是你是不是认为在1之前还有一个节点head?不是的head就是指向1