快慢指针法,未知长链表找中点


对于知道长度的单链表,找中间节点的方法比较简单
可以使用双指针,一个指针先出发,遍历一半节点之后,另一个指针再出发,这样后指针遍历到尾时,前指针正好在中间

但是对于未知长度的单链表,一般采用先遍历一遍链表求长度,在从头循环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;
    }
}