力扣刷题——143.重排链表
给定一个单链表 L
的头节点 head
,单链表 L
表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 :
输入:head = [1,2,3,4,5] 输出:[1,5,2,4,3]
我们可以借助寻找链表中间节点和逆置链表的方法来将链表的后半部分逆置然后操作。为什么要这样做呢,因为题目中链表中节点顺序的变化实际上是这样的
我们可以发现,当我们逆置后半部分链表后,实际上就是遍历后半部分链表,将其中的节点逐个按照题目规则插入到前半部分链表中。即:
ListNode *FindMid(ListNode *head)
{
ListNode *slow=head;
ListNode *fast=head;
while(fast&&fast->next)
{
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
ListNode *reverse(ListNode *p0)
{
ListNode *p1=nullptr;
ListNode *p2=p0;
while(p2)
{
ListNode *p3=p2->next;
p2->next=p1;
p1=p2;
p2=p3;
}
return p1;
}
void reorderList(ListNode* head) {
ListNode *mid=FindMid(head);
ListNode *head2=reverse(mid);
while(head2->next)
{
ListNode *nxt1=head->next;
ListNode *nxt2=head2->next;
head->next=head2;
head2->next=nxt1;
head=nxt1;
head2=nxt2;
}
}