我目前正在重新学习一些旧的数据结构知识,并决定解决HackerRank等问题。我遇到了一个简单的问题,我们必须在链表中检测一个循环,但我似乎无法理解我做错了什么。我已经查看了其他答案,并了解了它们的语法和逻辑,但似乎无法找到我的代码失败的逻辑。
boolean hasCycle(Node head) {
if (head == null || head.next == null){
return false;
}
Node first = head;
Node second = head.next;
while (second != null){
if (first == second)
{
return true;
}
first = first.next;
second = second.next.next;
}
return false;
}
答案 0 :(得分:0)
据我所知,你的列表可以在任何节点中都有一个圆圈,而不仅仅是第一个。您的代码远非解决方案。 您可以简化您对问题的看法,因为必须检查是否多次访问某个节点。 为此,您可以使用像这样的辅助函数
boolean visitedMoreThanOnce(Node head)
{
if (head.next == null){
return false;
}
Node second = head.next;
while (second != null){
if (head == second)
{
return true;
}
second = second.next;
}
return false;
}
然后你的功能可能是
boolean hasCycle(Node head) {
Node first = head;
while (first != null){
if (visitedMoreThanOnce(first))
{
return true;
}
first = first.next;
}
return false;
}
请注意,我使用您的功能签名解决了这个问题。通过查看问题中的注释中提供的链接中的问题,它接缝应该是指针。在这种情况下,您需要使用->
运算符,而不是.