查找链表是否为循环列表
Find if Linked list is circular
很抱歉再次提出基本问题,但我正在寻找答案。对于这个问题,为什么应该有快速和慢速指针迭代列表?为什么它不应该是一个具有以下逻辑的单个指针
ptr = head->next;
while(ptr != NULL)
{
if(ptr == head)
{
return true;
}
ptr = ptr->next;
}
return false;
为什么不能是这个逻辑?所有答案都基于两个指针逻辑,这样做有什么好处吗?
您不必有两个指针。 例如,您可以保留一个已经看到的指针列表或表,然后有一个指针遍历该列表并查阅该表以查看它是否已看到该列表。
与表查找解决方案相比,双指针解决方案的优势在于,无论列表有多大,您都只需为两个指针分配额外的内存。
你不能做一个指针并检查头部,除非你只关心有一个循环回到头的列表。 该列表可以在中间的某个地方循环回。
如果您的列表中有一个不包含头部的循环,并且您只有一个指针,您将如何识别它?你将永远陷入循环。
您需要两个指针(或先前节点的列表或类似的东西)来解决此问题。
以下是查找循环的几种方法。
http://ostermiller.org/find_loop_singly_linked_list.html
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 个指针...头部和PTR。
您需要跟踪 head 的位置,并且还需要另一个指针来遍历列表。
此外,通过您的实现,它将始终返回 true,因为ptr == head.
编辑:
阅读您的链接。
您还需要检查其他节点(不仅仅是头部)是否是圆形的
通读此链接,它很好地分解了它。
http://umairsaeed.com/2011/06/23/finding-the-start-of-a-loop-in-a-circular-linked-list/
相关文章:
- 通过for循环使用用户输入填充列表
- 下面是我为检测链接列表中的循环而制作的代码
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 在C++中循环访问自定义结构列表的小问题
- 如何找到循环列表的开头?
- c++ 循环访问对象列表并删除对象
- 查找链表是否为循环列表
- 标准库中的双链接循环列表
- 使用STD ::列表作为循环列表安全吗?
- 双向循环列表中的赋值运算符以错误的顺序添加元素
- 单链循环列表的复制构造函数
- C++-从单链循环列表中的任何索引中删除一个节点
- 当传递给函数时,奇异链表变为循环列表
- std::list是一个循环列表!!等等,什么
- 读取文件".txt"并将每行的数据分配给循环列表中的新节点C++
- 在循环列表时,删除列表中的对象的正确方法是什么
- c++循环列表错误
- 删除循环列表中的节点时崩溃
- STL算法可以与循环列表一起使用吗?
- 双链循环列表 c++