我需要一个方法,它将链表作为参数,如果它是循环的或不循环,则返回true或false。例如:圆形链表表示节点指向任何前一个节点。 我忘了告诉一些约束,我不能使用任何数据结构或动物内存分配。 我只能用局部变量和alogrithm可以在n个步骤,有人跟我说要做检查链表的循环性
Q
检查链表的循环性
3
A
回答
10
我相信你正在寻找Floyd's Cycle-Finding Algorithm。有一个比我能通过here更好的解释。
在C和Scheme中还有几个实现,其文档大小为here。
1
标准哈希计数适用(我现在想用两个指针?):
function has_loop(list): foreach node in list: address = address_of(node.next); element = hashtable.get(address); if (element == NULL): hashtable.put(address) else: return true return false
编辑:根据已接受的答案的第二个链接,这可行但效率低下,这意味着有很多更有效的解决方案。
0
这是微不足道的。
previousnodes ← set()
previousnodes.add(firstnode)
currentnode ← firstnode.next
while (currentnode in previousnodes) || (currentnode != null):
previousnodes.add(currentnode)
currentnode ← currentnode.next
when (currentnode = 0) return false
return true
0
我自己遇到了这个问题的一个优雅的解决方案,并忍不住在这里发布(尽管我猜原版海报可能现在已经毕业了)。从开始节点开始,开始反转列表。如果列表不是循环的,则该过程将以Null结束,如果列表确实是循环的,则该过程将在起始节点处结束。所以它就是一个具有恒定额外空间的线性时间算法。只需再次颠倒列表以恢复原始列表。
相关问题
- 1. 跟踪检测链表中的循环
- 2. 检测链接列表中的循环
- 3. 循环链表C
- 4. 什么时候需要检查链接列表循环?
- 5. 如何检查链表是否在Java中有循环?
- 6. 循环队列和循环链表
- 7. 将线性链表转换为循环链表
- 8. 的Java:NPE在循环链表:(
- 9. Swift中的循环链表
- 10. python中的循环链表
- 11. 理解双向链表循环链表
- 12. 双向链表循环链表
- 13. Java编程 - 循环链表
- 14. 循环链接列表
- 15. C链表无限循环
- 16. 同步循环链表
- 17. while循环链接列表
- 18. for each循环检查| AngularJS
- 19. 循环检查条件
- 20. PHP循环来检查ID
- 21. 重复性检查触发器错误508(循环检测)
- 22. 链接列表中的循环检测:穷举理论
- 23. 检查列表中的值。在循环内部还是外部循环?
- 24. 在没有Floyds循环检测算法的情况下检测链表中的循环
- 25. 更好的循环性能来检查单选按钮
- 26. For循环不检查每个对象的属性
- 27. 如何检查无向图中循环的存在性?
- 28. 我的循环链表不工作
- 29. 链接列表的JavaScript循环
- 30. 颠倒有循环的链表
嗯,如果一个节点指向的前一个节点不是列表中的第一个节点,这将不起作用。 – 2008-12-30 10:47:53
是的,它并不像我想的那样微不足道。但并非如此。 :) – Cheery 2008-12-30 10:49:56
检查我更新的问题 – 2008-12-30 10:56:52