我的代码出错了吗? (在链表中循环)

时间:2017-08-10 18:18:49

标签: java linked-list

我目前正在重新学习一些旧的数据结构知识,并决定解决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;
}

1 个答案:

答案 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;
}

请注意,我使用您的功能签名解决了这个问题。通过查看问题中的注释中提供的链接中的问题,它接缝应该是指针。在这种情况下,您需要使用->运算符,而不是.