/**
 * struct ListNode {
 *  int val;
 *  struct ListNode *next;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param head ListNode类
 * @return ListNode类
 */
struct ListNode* oddEvenList(struct ListNode* head ) {
    //思路
    //对超过2个结点的原链表进行重排,以第1结点为奇数结点的起始插入点,第2结点为偶数结点的起始插入点
    //从第3个结点开始,将奇数序号的结点依次插入奇数插入点

    struct ListNode *oddInsertNode = NULL;
    struct ListNode *moveNode = NULL; //操作结点
    struct ListNode *moveNodePre = NULL; //操作结点
    int cnt = 3;

    if (head == NULL || head->next == NULL || head->next->next == NULL) {
        //不超过2个结点,直接输出
        return head;
    }

    oddInsertNode = head;
    moveNodePre = head->next;
    moveNode = moveNodePre->next;

    while (moveNode) {
        if (cnt % 2 != 0) { //将奇数序号的结点依次放置在奇数插入点后
            moveNodePre->next = moveNode->next;
            moveNode->next = oddInsertNode->next;
            oddInsertNode->next = moveNode;
            moveNode = moveNodePre->next;

            oddInsertNode = oddInsertNode->next; //后移奇数插入点
        } else { //偶数结点不动
            moveNodePre = moveNodePre->next;
            moveNode = moveNodePre->next;
        }

        cnt++;
    }
    return head;
}