单链表的中间节点

时间:2016-07-26 04:01:36

标签: c++ list

我发现这段代码用C ++打印列表的中间节点,但我不理解代码......有人可以解释一下吗?

    Type& findMiddleNode()
{
    int check = 0;
    nodeType *current;
    nodeType *mid;

    current = first;
    mid = first;

    while (current != NULL)
    {
        current = current->link;
        check = (check + 1) % 2;

        if (check == 0)
            mid = mid->link;
    }

    return mid->info;
}
PD:这段代码很完美,但我不明白!有人帮我理解这一点。谢谢!

1 个答案:

答案 0 :(得分:2)

基本思路是在列表中移动两个指针B和A,但B的移动速度只有A的一半。

声明

check = (check + 1) % 2;

...赋予check值0,1,0,1等等,用于仅在每次移动A时移动B.

同样的想法是关于检查单链表是否包含循环的问题的一个可能(和预期)答案。在这种情况下,快速移动指针将在两者都进入循环后赶上慢速指针。

执行相同操作的简单方法是,(1)计算节点数 n ,(2)从头开始重新开始,转到节点号 n / 2。

步骤(1)移动指针 n 次,如上面的A,并且步骤(2)移动指针 n / 2次,如上面的B所示。