链表常见技巧——快慢指针
链表常见技巧——快慢指针
寻找链表中点
原理解析:一个两个指针,快指针得移动速度是慢指针得两倍(即快指针一次先后跳两个,慢指针一次跳一个),均从头节点出发,当快指针停下时,慢指针便到达中点处。
输入链表头节点,奇数长度返回中点,偶数长度返回上中点
public static Node midOrUpMid(Node head){
if (head == null){
return null;
}
Node slow = head;
Node fast = head;
while (fast.next != null && fast.next.next != null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
输入链表头节点,奇数长度返回中点,偶数长度返回下中点
public static Node midOrDownMid(Node head){
Node slow = head;
Node fast = head;
while (fast !=null && fast.next !=null){
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
二者细节区别剖析
主要看判断条件退出时,fast指针所在得位置
- 前者fast退出时,fast必在链表上(奇数时倒数第一个或偶数时倒数第二个)
- 当链表个数为偶数时,fast位置如下,为倒数第二个,此时,slow位于链表得上中点处
- 当链表个数为奇数时,fast位置如下,为倒数第一个,此时,slow位于链表得中点处
- 当链表个数为偶数时,fast位置如下,为倒数第二个,此时,slow位于链表得上中点处
- 后者fast退出时,fast不一定在链表上(奇数时在倒数第一个或偶数时在链表尾节点得后一个null处)
-
当链表个数为偶数时,fast位置如下,为最后一个节点得下一个null位置,此时,slow位于链表得下中点处
-
当链表个数为奇数时,fast位置如下,为倒数第一个,此时,slow位于链表得中点处
共同点
-
- 退出循环时候必定满足slow = fast/2
思考
- 上中点就好像屏蔽掉个数为偶数时最后一个节点,把偶数化为奇数节点
- 下中点就好像链表后面多一个null节点,把偶数化为奇数节点
应用
1、判断链表是否为回文结构
2、环形链表得检查
public class Solution {
public boolean hasCycle(ListNode head) {
if (head == null || head.next == null) {
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while (slow != fast) {
if (fast == null || fast.next == null) {
return false;
}
slow = slow.next;
fast = fast.next.next;
}
return true;
}
}