Problem
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→…
You may not modify the values in the list’s nodes, only nodes itself may be changed.
Example1
Given 1->2->3->4, reorder it to 1->4->2->3.
Example2
Given 1->2->3->4->5, reorder it to 1->5->2->4->3.
Solution
class Solution {
public:
void reorderList(ListNode
* head
) {
if(!head
|| !head
->next
|| !head
->next
->next
)
return;
int len
= 0;
ListNode
*cur
= head
;
while(cur
)
{
++len
;
cur
= cur
->next
;
}
len
=len
/2 -1;
cur
= head
;
while(len
)
{
--len
;
cur
= cur
->next
;
}
ListNode
*one_cur
= head
;
ListNode
*tmp
= cur
->next
;
cur
->next
= NULL;
ListNode
*two_cur
= reverse(tmp
);
ListNode dummy
;
head
= &dummy
;
while(one_cur
|| two_cur
)
{
if(one_cur
)
{
head
->next
= one_cur
;
head
= head
->next
;
one_cur
= one_cur
->next
;
}
if(two_cur
)
{
head
->next
= two_cur
;
head
= head
->next
;
two_cur
= two_cur
->next
;
}
}
head
= dummy
.next
;
}
ListNode
*reverse(ListNode
*head
)
{
if(!head
|| !head
->next
)
return head
;
ListNode
*newHead
= reverse(head
->next
);
head
->next
->next
= head
;
head
->next
= NULL;
return newHead
;
}
};