1、找到后半段链表的起始位置,将后半段结点逐个拆下来用头插法进行反转,
2、然后把反转后的链表结点一个一个插入到前半段链表中,注意间隔一个插一个。
void reorderList(struct ListNode* head ) {  
    if(head == NULL || head->next == NULL)
        return;   //空链表或只有一个结点不用改变
    struct ListNode* fast = head; 
    struct ListNode* slow = head;
    struct ListNode *p, *r, *s;   //临时指针
    while(fast->next != NULL && fast->next->next != NULL){   //
         fast = fast->next->next;   //快指针每次走两步
         slow = slow->next;   //慢指针每次走一步
    }
     //结点个数为奇数时,fast停在最后一个结点,slow停在正中间结点,即前半段末尾
     //结点个数为偶数时,fast停在倒数第二个结点,slow停在前半段最后一个结点处
     //无论奇数还是偶数,后半段链表的第一个结点就是slow的下一个结点
    p = slow->next;   //后半段起点
    slow->next = NULL;   //前半段最后一个结点尾指针域置空
    struct ListNode* L = NULL;   //后半段链表头指针
    while(p!=NULL){   //头插法四步曲
        r = p->next;
        p->next = L;
        L = p;
        p = r;
    }
    //反转完之后,头指针L指向第一个结点,即原链表的最后一个结点
    s = head;   //s指向前半段的第一个结点
    //开始逐个插入
    while(L != NULL){
        r = L->next;
        L->next = s->next;
        s->next = L;
        s = L->next;
        L = r;
    }
}