1、题目描述+解释
主要就是实现:第一个节点和最后一个节点交换,第二节点和倒数第二个节点交换,依次交换下去。
2、算法原理解析
3、代码编写
class Solution {
public:
void reorderList(ListNode* head) {
//先找到中间节点
ListNode* slow=head,*fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
//此时把链表从slow->next节点分为两个链表
ListNode* cur1=head;
ListNode* cur2=slow->next;
//把slow->next节点的后面断开
slow->next=nullptr;
//把后面的链表逆序一下
ListNode* new_head2=new ListNode(0);
while(cur2)
{
ListNode* next=cur2->next;
cur2->next=new_head2->next;
new_head2->next=cur2;
cur2=next;
}
//此时已有两个链表
//合并
cur2=new_head2->next;
ListNode* NewHead=new ListNode(0);
ListNode* ptail=NewHead;
while(cur1)
{
ptail->next=cur1;
ptail=cur1;
cur1=cur1->next;
if(cur2)
{
ptail->next=cur2;
ptail=cur2;
cur2=cur2->next;
}
}
}
};