876. 链表的中间结点

46 阅读1分钟

题目描述:

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

image.png

题解思路:

1、如果小于等于一个节点,就直接返回head

2、如果有两个节点,就返回head.next的节点

3、准备两个节点 slow 和 fast 让他们分别指在 head.next的位置

4、如果fast.next!=null && fast.next.next !=null , 接下来就是快指针每次走两步,慢指针每次走一步 最后返回慢指针即可。

public static ListNode middleNode(ListNode head) {
    if (head == null || head.next == null){
        return head;
    }
    if (head.next.next == null){
        return head.next;
    }

    ListNode slow = head.next;
    ListNode fast = head.next;

    while(fast.next!=null && fast.next.next!=null) {
        slow = slow.next;
        fast = fast.next.next;
    }

    return slow;
}