java——快慢指针思想

一、快慢指针的思想

       快慢指针法是一种常用的解决链表问题的算法思想。它的基本思想是使用两个指针,一个快指针和一个慢指针,它们以不同的速度遍历链表。

       具体来说,快指针每次移动两步,而慢指针每次移动一步。通过这种移动方式,快指针相对于慢指针的速度是两倍。当快指针到达链表末尾时,慢指针正好指向链表的中点。

二、应用场景

2.1寻找链表的中点:

       在链表中找到中点是许多问题的关键步骤。通过使用快慢指针法,快指针可以更快地遍历链表,而慢指针则以较慢的速度遍历。当快指针到达链表末尾时,慢指针正好位于链表的中间位置。

示例代码:

   public ListNode middleNode(ListNode head) {
        //使用快慢指针
        ListNode fast = head, low = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            low = low.next;
        }
        return low;
    }

原理:

        上图为y轴为速度,x轴为时间的坐标图, fast,low的斜率代表速度,fast是low的两倍,在相同时间内,fast走过的路程为大三角形的面积,low的路程为红色三角形,很显然,大三角形的面积为红色三角形面积的两倍,也就是fast走的路程为low的两倍,所以当fast遍历完了链表时,low指针刚好在链表的中点,我们只需要return low,就可以找到链表的中点。

2.2判断链表是否有环:

         快慢指针法也可以用于判断链表是否存在环。如果链表中存在环,那么快指针终究会追上慢指针并与其相遇。这是因为快指针每次移动两步,而慢指针每次移动一步,所以快指针会在环内多绕几圈,最终与慢指针相遇。

示例代码:

    ListNode fast = head, low = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            low = low.next;
            if (fast == low) {
                return true;
            }
        }
        return false;

原理:

只需要让二者在同一起跑线上出发,如果跑的快的指针在遍历完链表之前绕了圈追上了跑的慢的指针,那就说明链表存在环。


         解决其他问题:除了寻找中点和判断是否有环外,快慢指针法还可以应用于其他链表问题,如合并两个有序链表、判断链表是否交叉等。通过调整快慢指针的移动方式,我们可以灵活地解决各种链表问题.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值