读书笔记-链表问题(二)
问题:判定给定的链表是以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)