Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找链表是否是循环的_Java_C++_C - Fatal编程技术网

Java 查找链表是否是循环的

Java 查找链表是否是循环的,java,c++,c,Java,C++,C,很抱歉再次问这个基本问题,但我正在寻找答案。 对于这个问题,为什么应该有快速和慢速指针遍历列表? 为什么它不应该是具有如下逻辑的单个指针 ptr = head->next; while(ptr != NULL) { if(ptr == head) { return true; } ptr = ptr->next; } return false; 为什么不能是这种逻辑?所有答案都基于两个指针逻辑,这样做有什么好处吗?如果列表中有一个循环

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

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

为什么不能是这种逻辑?所有答案都基于两个指针逻辑,这样做有什么好处吗?

如果列表中有一个循环不包括标题,而您只有一个指针,您将如何确定这一点?你将永远陷入循环中。

您需要两个指针(或以前的节点列表或类似的东西)来解决此问题。

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

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


您不能只使用一个指针来检查head,除非您只关心具有回head循环的列表。列表可以在中间某个地方回退。

这里有几个方法可以找到一个循环。

你需要两个指针。。。头部和ptr

您需要跟踪head的位置,还需要另一个指针来遍历列表

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

编辑:

阅读你的链接

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

通读这个链接,它可以很好地分解它


关于
head->node1->node2->node1->node2->…
?“为什么应该有快指针和慢指针”什么是快速ptr?什么是慢ptr?因为您将ptr初始化为head,所以该代码将始终返回true。但假设您将其初始化为head->next;如果循环没有回到头部呢?这取决于确切的问题陈述。如果列表中有一个循环,但循环返回的元素指向,比如说,
head->next
head->head->next
?@Borgleader,我假设一个指针向前移动两个节点,另一个指针向前移动。谢谢Keppil,我不认为循环列表可以在这两个节点之间循环。我一直认为循环列表只有在最后一个节点指向第一个节点时才会出现。
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;
}