快慢指针的应用

快慢指针的应用

快慢快慢指针中的快慢指的是移动的步长,即每次向前移动速度的快慢。例如可以让快指针每次沿链表向前移动2,慢指针每次向前移动1次。

1、判断链表是否有环

用快慢指针判断是否有环相当于追赶问题,如果没有环fast指针必定先到达终点(链表尾部),且此时fast指针与slow指针必定没有相遇;若链表有环,fast指针先进入环内,然后slow指针进入,fast指针与slow指针必定相遇

/**
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */

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

若链表有环,此时当快慢指针第一次相遇时,让快指针从头开始,并与慢指针保持同样的速度前进,当两个指针相等时,此节点就是环的入口节点

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

2、寻找中位数

对于一个有序链表,fast指针速度为2,slow指针的速度为1,同时从起点出发则当fast指针到达链表底部时,则slow指针在中点(需判断节点数的奇偶),避免了需要先历遍链表求得长度再求中位数。

你可能感兴趣的:(算法)