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



京公网安备 11010502036488号