写点什么

日拱算法:典例 - 快慢指针解“环形链表”

作者:掘金安东尼
  • 2022 年 9 月 02 日
    广东
  • 本文字数:1053 字

    阅读完需:约 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解释:链表中没有环。
复制代码



解题方法就是:快慢指针。


快慢指针,顾名思义,是使用速度不同的指针(可用在链表、数组、序列等上面),来解决一些问题。


这些问题主要包括:


处理环上的问题,比如环形链表、环形数组等。需要知道链表的长度或某个特别位置上的信息的时候。快慢指针这种算法证明,它们肯定是会相遇的,快的指针一定会追上慢的指针;


可以理解成操场上跑步,跑的快的人套圈跑的慢的人。


一般用 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


<hr>


OK,以上便是本篇分享~


我是掘金安东尼,输出暴露输入,技术洞见生活,再会~

发布于: 刚刚阅读数: 4
用户头像

安东尼陪你度过漫长编程岁月~ 2022.07.14 加入

社会我瓜哥,人狠话不多😎 微信 anthony1453,加我交个朋友😎 正联合【机械工业出版社】出版《程序员成长手册》,敬请期待😎 真正的大师,永远怀着一颗学徒的心(易)😎

评论

发布
暂无评论
日拱算法:典例-快慢指针解“环形链表”_前端_掘金安东尼_InfoQ写作社区