题意:
        

方法:
模拟

思路:
        重点:单链表只能从前往后,而根据题意后半部分链表需要逆向遍历,因此需要反转后半部分链表。
    
        首先,寻找链表的中心点,将链表的后半部分反转;
         最后,模拟题意将单链表原地操作实现重排。

        

class Solution {
public:
    void reorderList(ListNode *head) {
        if(head==nullptr)
            return;
        int n=0;
        ListNode* p=head;
        while(p){//统计链表长度
            n++;
            p=p->next;
        }
        int t=(n+1)/2;
        p=head;
        while(t--){//寻找后半部分链表的头结点
            p=p->next;
        }
        ListNode *q=reverseList(p),*t1,*t2;//反转后半部分链表
        p=head;
        while(q){//实现重排链表操作
            t1=p->next;
            p->next=q;
            t2=q->next;
            q->next=t1;
            p=t1;
            q=t2;
        }
        p->next=nullptr;
    }
    ListNode* reverseList(ListNode* h){//反转后半部分链表
        if(h==nullptr){
            return nullptr;
        }
        ListNode *p=h,*q=h->next,*t;//初始化
        p->next=nullptr;
        while(q){//反转链表操作
            t=q->next;
            q->next=p;
            p=q;
            q=t;
        }
        return p;
    }
};


时间复杂度:
空间复杂度: