题意:
方法:
模拟
思路:重点:单链表只能从前往后,而根据题意后半部分链表需要逆向遍历,因此需要反转后半部分链表。
首先,寻找链表的中心点,将链表的后半部分反转;
最后,模拟题意将单链表原地操作实现重排。
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; } };
时间复杂度:空间复杂度: