判断一个链表是否为环形链表的常见方法是使用快慢两个指针遍历链表,也被称作 "乌龟和兔子" 算法或者 "Floyd 判圈法"。其中,一个指针(慢指针)每次移动一步,而另一个指针(快指针)每次移动两步。以下是具体的步骤:
- 初始化两个指针 slow 和 fast,都指向链表的头节点 head。
- 同时移动两个指针,slow 每次移动一步,fast 每次移动两步。
- 如果链表中存在环,那么 fast 指针将最终与 slow 指针相遇;如果链表中不存在环,那么 fast 指针将会到达链表的末尾。
// 将数组转成链表
class Node{
constructor(val){
this.val = val;
this.next = null;
}
}
const converseNode = (arr)=>{
let head = new Node(arr[0])
let cur = head;
for(let i = 1; i < arr.length; i++){
cur.next = new Node(arr[i]);
cur = cur.next;
}
// 成环关键代码
cur.next = head;
return head;
}
const nodeArr = converseNode([1,2,3,4,5])
console.log(nodeArr)
// 判断链表中是否有环
function isCircular(head) {
let fast = head;
let slow = head;
while(fast && fast.next && fast.next.next){
fast = fast.next.next;
slow = slow.next;
if(fast === slow){
// 如果两个指针相遇,则存在环
return true;
}
}
// fast 指针已经到达了链表的末尾,说明链表是无环的
return false;
}
console.log("---", isCircular(nodeArr))