职业经验 每日一道面试题 # 判断单链表是否有环的 java 实现

在路上 · 2018年04月16日 · 最后由 abcnull 回复于 2020年04月13日 · 2256 次阅读

题目:

有一个链表,怎么判断链表中是否有环?

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

楼主我用 PYTHON 写一写 可以吗?

(回想到当年学的数据结构了,看了一篇 C 解法,用 PYTHON 写了一遍)
算法:使用一个 slow 指针和 fast 指针
fast 指针一次走两步
slow 指针一次走一步
当 fast==slow 说明有环
环的入口:(cur 指针指向头,inter 指向 fast 与 slow 相交点)
inter=slow
遍历
当 inter==cur 找到入口

leetcode 原题,可以用集合来解决

public class Solution {
    public boolean hasCycle(ListNode head) {
        ArrayList<ListNode> list = new ArrayList<>();
        for (int i = 0; head != null; head = head.next) {
            if (list.contains(head))
                return true;
            else
                list.add(head);
        }
        return false;
    }
}

面试官:要是不允许使用集合类来解题呢?

那就用双指针,快的一次走两步,慢的一次走一步,总有一次会相遇

public class Solution {
    public boolean hasCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if (fast == slow)
                return true;
        }
        return false;
    }
}

算是双指针比较经典的题

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册