很抱歉再次提出基本问题,但我正在寻找答案。 对于这个问题,为什么应该有快速和慢速指针迭代列表? 为什么它不应该是带有逻辑的单个指针,如下所示
ptr = head->next;
while(ptr != NULL)
{
if(ptr == head)
{
return true;
}
ptr = ptr->next;
}
return false;
为什么不能成为这种逻辑呢?所有答案都基于两个指针逻辑是否有任何优势呢?
答案 0 :(得分:1)
你不必有两个指针。例如,您可以保留已经看过的指针列表或表,然后使用单个指针遍历列表并查询表以查看它是否已经看过。
两个指针解决方案相对于表查找解决方案的优势是,无论列表有多大,您只需为两个指针分配额外的内存。
你不能做一个指针并检查头部,除非你只关心有回头的循环列表。该列表可以在中间的某个地方循环。
答案 1 :(得分:0)
如果您的列表中有一个不包含头部的循环,并且您只有一个指针,那么您如何识别?你将永远陷入困境 你需要两个指针(或以前的节点列表或类似的东西)来解决这个问题。
答案 2 :(得分:0)
以下是寻找循环的几种方法。
答案 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/