【问题标题】:Given a linked list, determine if it has a cycle in it [duplicate]给定一个链表,确定它是否有一个循环[重复]
【发布时间】:2015-06-18 06:19:39
【问题描述】:

我正在查看 programcreek.com 中关于在链表中查找循环的以下代码,并想知道如何通过将 ListNode 类型的变量“head”作为参数传递给布尔方法在此处声明。 Java中是否有数据类型ListNode。我似乎无法在文档中找到它。 其次,我们如何为此分析时间和空间复杂度。

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;

        if(head == null)
            return false;

        if(head.next == null)
            return false;

        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;

            if(slow == fast)
                return true;
        }

        return false;
    }
}

【问题讨论】:

  • stackoverflow.com/a/2663147/1897935 两个人以不同的速度绕着一圈跑。两者都必须在某个时间点见面。 (如果它有 2 个方向,那么你可以从两个方向走并找到循环但你只有一个方向)

标签: java algorithm linked-list


【解决方案1】:

ListNode类在java中没有定义,必须单独定义。这里是一个如何定义的例子

public class linkedlistcycle {

    class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
            next = null;
        }
    }

    public boolean hasCycle(ListNode head){
        ListNode a = head ;
        ListNode b = head ;


        if ((head == null) || (head.next==null))
        {   return false;}

        while ((head != null) | (head.next != null))
        {

            a = a.next ;
            b = b.next.next;
                    if(a == b)
                        return true;
        } 

    return false ;

        }



    }

【讨论】:

    【解决方案2】:

    在这个函数中,boolean是函数hasCycle()的返回类型。此函数的输入是 Class ListNode 的对象,如果存在则需要为其查找循环。此功能工作正常。我不认为 Java 有一个名为 ListNode 的类。你可以找到时间复杂度here

    【讨论】:

    • 既然这个函数的输入是ListNode类的对象,是否应该单独声明ListNode类才能让代码工作?
    猜你喜欢
    • 2010-10-04
    • 2017-04-08
    • 2017-12-16
    • 2017-07-02
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多