LeetCode:Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln,
reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You must do this in-place without altering the nodes' values.
For example,
Given {1,2,3,4}
, reorder it to {1,4,2,3}
.
解题思路:
1、把链表分成两个链表:从中间节点分开,分为前半部分和后半部分
2、把后半部分链表就地逆置
3、再把后半部分的链表插入到前半部分的链表:一个隔一个的插入。
ListNode* ReverseList(ListNode* head)
{
ListNode *p,*q;
p=head->next;
if(p == NULL)
return head;
while(p->next!=NULL) //在这个循环过程中p所指的元素一直是不变的
{
q=p->next;
p->next=q->next;
q->next=head->next;
head->next=q;
}
p->next=head; //相当于成环
head=p->next->next; //新head变为原head的next
p->next->next=NULL; //断掉环
return head;
}
void reorderList(ListNode *head)
{
if(head==NULL || head->next==NULL)
return ;
ListNode* fast = head;
ListNode* slow = head;
//将slow、fast后移,slow一次移动一步,fast一次移动两步,最终fast移动到末尾的时候slow移动到中点
while(fast->next!=NULL && fast->next->next!=NULL)
{
slow = slow->next;
fast = fast->next->next;
}
//翻转链表的后半部分
ListNode* head2 = ReverseList(slow->next);
slow->next = NULL;
ListNode* p = head;
ListNode* q = head2;
ListNode* tmp = NULL;
//最后将head2中的元素每隔一个插入前面半截链表
while(q!=NULL)
{
tmp = q->next;
q->next = p->next;
p->next = q;
p = q->next;
q = tmp;
}
}