Linked List Cycle


https://leetcode.com/problems/linked-list-cycle/#/description

首先想到的思路就是,用hash 表来存下每个node 的指针,然后遍历链表,每个node 都去哈希表里查一下,如果之前遇到过就说明链表是有圈的。

另一个思路比较有启发性,就是看看操场上跑步的人,如果操场是个圈,那么从同一起点出发,两个速度不一样的人,总会在某一点再次相遇。

如果不是一个圈,那么跑得快的人会最先到达重点,两人永远不会再相遇(sad

所以思路就是,维护两个指针,一个快指针,一个慢指针。快指针每次迭代都往前走一步,但是慢指针每两次迭代才走一步。注意这里指针更新的方式

一定要保证每个node 都踩过,不能跳指针(当然在链表里一次往前走两个node 是反直觉的

这样可以证明,如果链表有圈的话,两个指针总会在某个点相遇。

var hasCycle = function(head) {
    if (head == null) return false;
    var slow_go = 0;
    var fast = head.next;
    var slow = head;

    while (fast != null && fast != slow) {
        if ((++slow_go) % 2 === 0) {
            slow = slow.next;
        }
        fast = fast.next;
    }

    return fast == slow;
};

优质内容筛选与推荐>>
1、Soap 教程
2、Unity创建asset文件的扩展编辑器
3、SQL Server 负载均衡集群方案之Moebius
4、iOS多线程-全面总结
5、sql学习笔记1


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号