开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第3天,点击查看活动详情
引言
算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。
题目描述
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例 1:
输入: head = [3,2,0,-4], pos = 1
输出: true
解释: 链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入: head = [1,2], pos = 0
输出: true
解释: 链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入: head = [1], pos = -1
输出: false
解释: 链表中没有环。
分析
根据题目的分析,我们如何判断链表存在环?可以让一个指针每次走1步,另一个指针一次性走2步,如果二者相遇说明存在环,否则不存在。
- p和q指针开始都指向第一个元素
- p一次性走1步,q一次性走2步
- 如果二者相遇,说明存在环
- 如果二者有一个是空,说明不存在环
- 返回结果
解答
var hasCycle = function(head) {
let p,q
if(!head || !head.next) return false
p = head,q = head
while(q) {
p = p.next
if(q.next) q = q.next.next
else return false
if(p===q) return true
}
return false
};
通过题目的分析,我们可以根据环形链表的特性,让两个指针同时从第一个位置开始,一个走1,一个走2。如果相遇则有环存在。
总结
通过对环形链表题目的讲解,大家学到了进行问题的解决。通过判断链表循环算的巧妙解决可以优雅的在低时间和空间复杂度下完成任务。