這是一道經典面試題:給定一個連結清單,判斷連結清單中是否有環。
例如:給定 head = [3,2,0,-4],判斷對外連結表中有一個環,其尾部連接配接到第二個節點。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLwkzM4EDN1IDM5EjNwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
對于這道題的解題思路是采用快慢指針:給定兩個指針慢指針slow和快指針fast,例如慢指針slow走一步,快指針fast走兩步,當slow和fast(slow和fast指向的節點一樣)相遇即有環。
package 連結清單;
/**
* https://leetcode-cn.com/problems/linked-list-cycle/
*
* @author boyas
* @create 2021/6/19 2:09
*/
//采用快慢指針:例如慢指針slow走一步,快指針fast走兩步,slow和fast(slow和fast指向的節點一樣)相遇即有環
public class _141_環形連結清單 {
//為了表示給定連結清單中的環,我們使用整數 pos 來表示連結清單尾連接配接到連結清單中的位置(索引從 0 開始)。
// 如果 pos 是 -1,則在該連結清單中沒有環。
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) return false;
ListNode slow = head;//頭節點為慢指針slow
ListNode fast = head.next;//第二個節點為快指針fast
while (fast != null && fast.next != null) {
if (fast == slow) return true;
slow = slow.next;
fast = fast.next.next;
}
return false;
}
}
效率隻有63.86%,不太行哈!