链表数据类型的特点决定了它只能单向顺序访问,而不能逆向遍历或随机访问(按下标访问)。
很多时候,我们需要使用快慢指针的技巧来实现一定程序的逆向遍历,或者减少遍历的次数。这就是为什么快慢指针常用于链表问题。
快指针一次前进两个结点,速度是慢指针的两倍。这样当快指针到达链表尾部时,慢指针正好到达的链表的中部。过程如下方动图所示。
public ListNode middleNode(ListNode head) {
ListNode fast = head;
ListNode slow = head;
while(fast !=null&&fast.nxet!=null){
fast = fast.next.next;
slow=fast.next;
}
// 链表元素为奇数个时,slow 指向链表的中点
// 链表元素为偶数个时,slow 指向链表两个中点的右边一个
return slow;
};