单链表的中间节点

Middle node of Singly linked List

本文关键字:中间 节点 链表 单链表      更新时间:2023-10-16

我在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:这个代码很好用,但我不明白!有人帮我理解这一点。谢谢

基本思想是在列表中移动两个指针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。