链表的中间节点

思路:

1.设置两个指针,一个快指针fast和慢指针slow,快指针以两个节点两个节点进行移动,慢指针以一个节点进行移动

2.只要当fast指针和fast.next指针还没有指向null

3.最后slow指向的就是链表的中点

代码:

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    public ListNode middleNode (ListNode head) {
        //如果是空的链表,就直接返回链表的头结点
        if(head==null){
            return head;
        }
        //设置两个指针:fast和slow分别指向链表的首地址
        //让fast以两个节点两个节点的速度进行移动,让slow以一个节点的速度移动
        ListNode fast=head;
        ListNode slow=head;
        //只要快节点和其下一个节点还没有到达null
        //就让快节点以慢节点的两倍速走
        while(fast!=null&&fast.next!=null){
            slow=slow.next;
            fast=fast.next.next;
        }
        //最后慢指针指向的就是链表的中间
        return  slow;

    }
}