• 算法
    • 1.快慢指针找到中间节点
    • 2.可以看出找到的中间节点是一定挂在末尾不会变的,所以将其再移动一个位置,并且把它前面的节点挂个null表示前半部分链表结束
    • 3.翻转后半部分链表
    • 4.将翻转后的后半部分链表逐个插入前半部分即可
public void reorderList(ListNode head) {
    if (head == null) {
        return;
    }

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

    ListNode rightHalf = reverseList(slow);
    ListNode leftHalf = head;
    while (rightHalf != null) {
        ListNode leftNext = leftHalf.next;
        ListNode rightNext = rightHalf.next;

        leftHalf.next = rightHalf;
        rightHalf.next = leftNext;

        leftHalf = leftNext;
        rightHalf = rightNext;
    }
}

private ListNode reverseList(ListNode head) {
    ListNode prev = null;
    ListNode curr = head;
    while (curr != null) {
        ListNode next = curr.next;
        curr.next = prev;
        prev = curr;
        curr = next;
    }
    return prev;
}