快慢指针法,未知长链表找中点
对于知道长度的单链表,找中间节点的方法比较简单
可以使用双指针,一个指针先出发,遍历一半节点之后,另一个指针再出发,这样后指针遍历到尾时,前指针正好在中间
但是对于未知长度的单链表,一般采用先遍历一遍链表求长度,在从头循环len/2 次遍历到中间节点
改进:
使用快慢指针,一个指针每次前进两步,一个指针一次前进一步,但是需要注意快指针不要越界
public static ListNode middleNode1(ListNode head){
ListNode fast=head,slow=head;
while(fast.next!=null&&fast.next.next!=null){
fast=fast.next.next;
slow=slow.next;
}
if(fast.next!=null&&fast.next.next==null){//处理有偶数情况下最后一次fast和slow不移动
slow=slow.next;
}
return slow;
}
单链表数据结构:
class ListNode {
int val;
ListNode next;
ListNode() {
}
ListNode(int val) {
this.val = val;
}
ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}