日拱算法:典例-快慢指针解“环形链表”
【摘要】 本篇带来一道基础但典型的体现快慢指针思路的算法题:环形链表快慢指针是双指针的一种,用于判断链表是否有闭环,十分好用~ 冲ヾ(◍°∇°◍)ノ゙题:给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:p...
本篇带来一道基础但典型的体现快慢指针思路的算法题:环形链表
快慢指针是双指针的一种,用于判断链表是否有闭环,十分好用~ 冲ヾ(◍°∇°◍)ノ゙
题:
给你一个链表的头节点 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
解释:链表中没有环。
解题方法就是:快慢指针。
快慢指针,顾名思义,是使用速度不同的指针(可用在链表、数组、序列等上面),来解决一些问题。
这些问题主要包括:
处理环上的问题,比如环形链表、环形数组等。
需要知道链表的长度或某个特别位置上的信息的时候。
快慢指针这种算法证明,它们肯定是会相遇的,快的指针一定会追上慢的指针;
可以理解成操场上跑步,跑的快的人套圈跑的慢的人。
一般用 fast 定义快指针,用 slow 定义慢指针。
速度不同是指 fast 每次多走几步,slow 少走几步。一般设定的都是 fast 走 2 步,slow 走 1 步。
当然设置成别的整数也是可以的,比如 fast 走 3 步,slow 走 1 步。
JavaScript 实现:
/**
* @param {ListNode} head
* @return {boolean}
*/
var hasCycle = function(head) {
// 快慢指针初始化指向 head
let slow = head;
let fast = head;
// 快指针走到末尾时停止
while (fast && fast.next) {
// 慢指针走一步,快指针走两步
slow = slow.next;
fast = fast.next.next;
// 快慢指针相遇,说明含有环
if (slow == fast) {
return true;
}
}
// 不包含环
return false;
};
另外:还提供一个神奇的解法:o( ̄▽ ̄)d
即:
var hasCycle = function (head) {
try {
JSON.stringify(head)
} catch{
return true
}
return false
};
原理是:
如果JavaScript对象本身包含循环引用,则JSON.stringify不能正常工作,错误消息:
VM415:1 Uncaught TypeError: Converting circular structure to JSON
OK,以上便是本篇分享~
我是掘金安东尼,输出暴露输入,技术洞见生活,再会~
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)