一、快慢指针的思想
快慢指针法是一种常用的解决链表问题的算法思想。它的基本思想是使用两个指针,一个快指针和一个慢指针,它们以不同的速度遍历链表。
具体来说,快指针每次移动两步,而慢指针每次移动一步。通过这种移动方式,快指针相对于慢指针的速度是两倍。当快指针到达链表末尾时,慢指针正好指向链表的中点。
二、应用场景
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;
原理:
只需要让二者在同一起跑线上出发,如果跑的快的指针在遍历完链表之前绕了圈追上了跑的慢的指针,那就说明链表存在环。
解决其他问题:除了寻找中点和判断是否有环外,快慢指针法还可以应用于其他链表问题,如合并两个有序链表、判断链表是否交叉等。通过调整快慢指针的移动方式,我们可以灵活地解决各种链表问题.