算法7(力扣141)-循环链表
1、问题
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递
仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false
2、采用例子
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
3、实现思路
先创建循环链表
4、具体步骤
(1)定义链表结构(因为此次需要使用数组创建链表,所以定义链表结构需要给next一个默认值null)
(2)创建循环链表
实现思路:找到开始循环的节点,将链表循环的最后一位指向开始循环的节点
1)通过传递数组长度是否为空,判断链表是否为空链表,空链表直接返回
2)定义链表头结点、当前节点和开始循环的节点
3)通过循环遍历赋值,同时寻找开始循环的节点(给的有开始循环的位置pos)
4)循环结束后,让链表的最后一个循环点指向开始循环的点
5)打印并返回链表
(3)检查是否有循环
通过快慢指针,当快指针追上慢指针时,即存在循环
1)判断是否是空链表,空链表返回
2)进入函数,定义快慢指针,判断是否有循环,存在返回true
3)函数结束,无循环返回false
5、完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>环形链表</title>
</head>
<body>
<p>
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递
。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false
</p>
<p>
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
</p>
<script>
class ListNode{
constructor(val,next=null){
this.val = val
this.next = next
}
}
let arr = [3, 2, 0, -4]
let pos = 1
let head = cycleList(arr,pos)
hasCycle(head)
// 怎么创建一个环形链表
function cycleList(arr,cycleStartIndex){
// 空数组,即链表为空
if (arr.length===0) {
return null
}
// 头结点
let head = new ListNode(arr[0])
// 当前节点
let cur = head
// 开始循环的节点
let cycleNode = null
for (let i = 1; i < arr.length; i++) {
// 利用数组的值创建节点,赋值给当前节点
cur.next = new ListNode(arr[i])
// 指针后移
cur = cur.next
// 判断循环点,是循环点,将当前节点赋值给循环点作为标记,方便后续构建闭环
if(i === cycleStartIndex){
cycleNode = cur
}
}
// 让循环结束时当前节点的下一位指向循环点,构成闭环
cur.next = cycleNode
console.log(head);
// 返回链表
return head
}
function hasCycle(head){
// 空链表
if (!head)return false;
// 使用快慢指针,当快指针和慢指针指向同一节点时存在环
let slow = head
let fast = head
while(fast&&fast.next){
fast = fast.next.next
slow = slow.next
if(fast == slow){
console.log(true);
return true
}
}
console.log(false);
return false
}
</script>
</body>
</html>
6、力扣通过代码
var hasCycle = function(head) {
// 空链表
if (!head)return false;
// 使用快慢指针,当快指针和慢指针指向同一节点时存在环
let slow = head
let fast = head
while(fast&&fast.next){
fast = fast.next.next
slow = slow.next
if(fast == slow){
console.log(true);
return true
}
}
console.log(false);
return false
};