查找链接列表是否为循环

时间:2014-02-28 22:53:17

标签: java c++ c

很抱歉再次提出基本问题,但我正在寻找答案。 对于这个问题,为什么应该有快速和慢速指针迭代列表? 为什么它不应该是带有逻辑的单个指针,如下所示

ptr = head->next;
while(ptr != NULL)
{
    if(ptr == head)
    {
        return true;
    }
    ptr = ptr->next;
}
return false;

为什么不能成为这种逻辑呢?所有答案都基于两个指针逻辑是否有任何优势呢?

4 个答案:

答案 0 :(得分:1)

你不必有两个指针。例如,您可以保留已经看过的指针列表或表,然后使用单个指针遍历列表并查询表以查看它是否已经看过。

两个指针解决方案相对于表查找解决方案的优势是,无论列表有多大,您只需为两个指针分配额外的内存。

你不能做一个指针并检查头部,除非你只关心有回头的循环列表。该列表可以在中间的某个地方循环。

答案 1 :(得分:0)

如果您的列表中有一个不包含头部的循环,并且您只有一个指针,那么您如何识别?你将永远陷入困境 你需要两个指针(或以前的节点列表或类似的东西)来解决这个问题。

答案 2 :(得分:0)

以下是寻找循环的几种方法。

http://ostermiller.org/find_loop_singly_linked_list.html

答案 3 :(得分:0)

bool circular(node head*){
    //Honestly not sure if this should be true or false...
    if(head->next == NULL) return false; 

    node ptr = head->next;

    while(ptr != NULL)
    {
        if(ptr == head)
        {
            return true;
        }
        ptr = ptr->next;
    }
    return false;
}

你确实需要2个指针...... Head和ptr。

你需要跟踪头部的位置,还需要另一个指针来迭代列表。

此外,通过您的实现,它将始终返回true,因为ptr == head.

编辑:

阅读你的链接。

您还需要检查其他节点(不仅仅是头部)是否为圆形

通读此链接可以很好地分解它。

http://umairsaeed.com/2011/06/23/finding-the-start-of-a-loop-in-a-circular-linked-list/