/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */

/**
 *
 * @param head ListNode类
 * @return  void
 */
void reorderList(struct ListNode* head ) {
    //思路
    //使用快慢指针,将链表均分为两段,将后段逆序之后,依次插入前段:{123456} -> {123}{456} -> {123}{654} -> {162534}
    struct ListNode list1HeadNode = { .next = head };
    struct ListNode* fast = &list1HeadNode;
    struct ListNode* slow = &list1HeadNode;
    struct ListNode* list2Head = NULL;
    struct ListNode* nodeTmp = NULL;

    if ((head == NULL) || (head->next == NULL)) {
        return;
    }

    //使用快慢指针,将链表均分为两段
    while ((fast != NULL) && (fast->next != NULL)) {
        fast = fast->next->next;
        slow = slow->next;
    }

    //将后段原地逆序
    list2Head = slow->next;
    nodeTmp = list2Head->next;
    while (nodeTmp != NULL) {
        list2Head->next = nodeTmp->next;
        nodeTmp->next = slow->next;
        slow->next = nodeTmp;
        nodeTmp = list2Head->next;
    }

    //将后段结点依次间隔地插入前段
    nodeTmp = head;
    list2Head = slow->next;
    while ((nodeTmp != NULL) && (list2Head != NULL)) {
        slow->next = list2Head->next;
        list2Head->next = nodeTmp->next;
        nodeTmp->next = list2Head;
        nodeTmp = nodeTmp->next->next;
        list2Head = slow->next;
    }

    return;
}