读书笔记-链表问题(二)

问题:判定给定的链表是以NULL结尾,还是形成一个环

是否存在时间复杂度为O(n)的算法求解问题

思路:

使用Floyd环判定算法,该方法使用两个在链表中具有不同移动速度的指针。一旦它们进入环就会相遇,即表示存在环。这个判定方法的正确性在于,快速移动指针和慢速移动指针将会指向同一位置的唯一可能情况,就是整个或者部分链表是一个环。

设想一下,乌龟和兔子在一个轨道上赛跑,如果它们在一个环上赛跑,那么跑得快的兔子将赶上乌龟。

代码实现:

boolean DoesLinkedListContainsLoop(ListNode head){

    if(head == null)

        return false;

    ListNode slowPtr = head,fastPtr = head;

    while(fastPtr.getNext() != null && fastPtr.getNext().getNext() != null){

        slowPtr = slowPtr.getNext();

        fastPtr = fastPtr.getNext().getNext();

        if(slowPtr == fastPtr)

            return true;

    }

    return false;

}

时间复杂度为O(n),空间复杂度为O(1)

猜你喜欢

转载自blog.csdn.net/u012149181/article/details/80071966
今日推荐