问题: 给定一个循环链接列表,实现一个在循环开始时返回节点的算法。
我不是在要求回答这个问题!
我知道有一些循环检测算法涉及两个以不同速度移动的指针,我已经知道这个问题的一些答案。
但是,我想知道的是,当我第一次尝试解决这个问题时,我是这样接近的:
LinkedListNode loopExists(LinkedListNode node) {
HashSet hs = new HashSet();
while(node != null) {
if(hs.contains(node))
return node;
else
hs.add(node);
node = node.next;
}
return null;
}
我很好奇,因为没有像我上面发布的答案
。问题是在循环开始时询问节点。
如果我遍历链表检查每个节点(不是node.data(,如果我再次找到相同的节点,我假设这是循环开始时的节点。
这种方法有什么问题吗?如果我有什么误解,请告诉我。谢谢!
是的,当然,我们可以有多种解决方案。而且,如果解决方案不可用,那么这并不意味着它不能成为解决方案。
例如,另一种解决方案可能是,我们可以在每个节点中flag
属性,并在访问时标记为checked
。在这种情况下,如果同一节点再次重复,那么我们可以检查flag
属性并检测循环。
现在,在您的情况下,您正在使用不必要的内存来存储节点对象,这可以通过运行循环来在不存储节点对象的情况下解决。