我发现这段代码用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:这段代码很完美,但我不明白!有人帮我理解这一点。谢谢!
答案 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所示。