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->null, reorder it to 1->4->2->3->null.
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The first node of linked list.
* @return: void
*/
void reorderList(ListNode *head) {
// write your code here
//为空和一个值的情况
if(head==NULL||head->next==NULL){
return;
}
//用快慢指针找链表的中心
ListNode *faster=head;
ListNode *slower=head;
while(faster->next!=NULL && faster->next->next!=NULL){
slower=slower->next;
faster=faster->next->next;
}
ListNode *head2=slower->next;
slower->next=NULL;
//逆转第二个子链表
faster=head2->next;
slower=head2;
while(faster){
ListNode *next=faster->next;
faster->next=slower;
slower=faster;
faster=next;
}
head2->next=NULL;
//将第二个子链表一次插到第一个中
ListNode *p1=head;
ListNode *p2=slower;
while(p2){
ListNode* p1Next=p1->next;
ListNode* p2Next=p2->next;
p1->next=p2;
p2->next=p1Next;
p1=p1Next;
p2=p2Next;
}
}
};