1:快慢指针
指的是有两个指针,每次前进的距离不同
快慢指针的起点都一样:
前进快的就是快指针 前进慢的就是慢指针
快指针每次前进2格 慢指针每次前进一格
2:常见题目
- 查找链表的中间节点
如果链表长度为奇数,那么只用返回中间的值,如果链表长度为偶数,就返回第二个值
可以使用快慢指针
1:判断条件是。快指针不是空,快指针的下一步也不是空
fast!=null && fast.next!=null
当只有3个值的时候,快指针一次运行就到头了,此时慢指针就运行到中间
2:假如有4个数目
快指针第一次运行到第3个位置,慢指针运行到第2个位置
快指针下一次判断满足,运行到第4个位置,慢指针运行到第3个位置
结果快指针没有满足,慢指针也不动了,就运行到了第3个位置了
public static ListNode middleNode(ListNode head) {
if(head==null){
return null;
}
ListNode fast=head.next.next;
ListNode low=head.next;
//核心方法在于,此时必须是fast不是null fast.next不是null
while (fast!=null && fast.next!=null){
fast=fast.next;
low=low.next;
}
return low;
}
- 判断链表是否用环
public static boolean hasCycle(ListNode head) {
if(head==null || head.next==null){
return false;
}
ListNode fast=head;
ListNode slow=head;
while(fast!=null && slow!=null){
fast=fast.next.next;
slow=slow.next;
if(fast==slow){
return true;
}
}
return false;
}