判断链表是否有环

18 篇文章 0 订阅

1.题目

有一个单向链表,请判断它是否带环。

2.分析

  • 这题我们仍然使用快慢指针的方法,fast的速度是slow速度的二倍。

  • 两个指针同时走,肯定是fast先到达环中,slow后到达环中。

  • 这时,我们可以看成快指针追慢指针的问题,快指针的速度快,慢指针的速度慢,肯定会遇到。遇到说明有环,到达末尾说明没环

3.代码

/**
 * Describe:有一个单向链表,请判断它是否带环。
 * User:lenovo
 * Date:2023-01-06
 * Time:19:07
 */
class Node {
    int val;
    Node next;

    public Node() {

    }
    public Node(int val) {
        this.val = val;
    }
}
class MyLinkedList {
    public Node head;

    public MyLinkedList(Node head) {
        this.head = head;
    }
    public MyLinkedList() {
    }
}

public class Test {
    public static boolean hasRing(MyLinkedList list) {
        //判断链表是否为空
        if(list == null || list.head == null) {
            return false;
        }
        //开始判断
        Node fast = list.head;
        Node slow = list.head;
        while(fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            if(fast == slow) {
                return true;
            }
        }
        return false;

    }
    public static void main(String[] args) {
        Node n1 = new Node(5);
        Node n2 = new Node(8);
        Node n3 = new Node(10);
        Node n4 = new Node(8);
        Node n5 = new Node(5);
        Node n6 = new Node(5);
        n1.next = n2;
        n2.next = n3;
        n3.next = n4;
        n4.next = n5;
        n5.next = n6;
        MyLinkedList list = new MyLinkedList(n1);
        System.out.println(hasRing(list));
    }
}
  • 先判断是否为空,为空直接返回false;

  • 让fast走两步,slow走一步,直到它们相遇,返回ture;

  • fast走到末尾,说明没有环,返回false.

4.总结

这题代码并不难,难的是思想。如果理解不了,我们可以把问题看成这样:

有这样的跑到,同时从起点出发,有两辆车fast和slow,fast的速度是slow的二倍,当slow到达跑到后,fast到达跑到的某一位置,fast的速度比slow只快了1个节点,fast肯定能与slow到达同一个位置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值