Problem:
iven 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}
.
Analysis:
Solutions:
C++:
void reorderList(ListNode* head)
{
if(head == NULL || head->next == NULL || head->next->next == NULL)
return;
ListNode *fast = head;
ListNode *slow = head;
while(fast->next != NULL && fast->next->next != NULL) {
fast = fast->next;
fast = fast->next;
slow = slow->next;
}
ListNode *temp_head = slow->next;
slow->next = NULL;
ListNode *new_head = NULL;
ListNode *p_cur = NULL;
while(temp_head != NULL) {
ListNode *temp = temp_head->next;
if(p_cur == NULL) {
new_head = temp_head;
p_cur = temp_head;
p_cur->next = NULL;
} else {
new_head = temp_head;
temp_head->next = p_cur;
p_cur = new_head;
}
temp_head = temp;
}
ListNode *r_head = NULL;
p_cur = NULL;
while(head != NULL) {
if(head && head->next == NULL && new_head == NULL) {
p_cur->next = head;
p_cur->next->next = NULL;
break;
}
ListNode *temp1 = head->next;
ListNode *temp2 = new_head->next;
if(p_cur == NULL) {
r_head = head;
r_head->next = new_head;
r_head->next->next = NULL;
p_cur = r_head->next;
} else {
p_cur->next = head;
p_cur->next->next = new_head;
p_cur->next->next->next = NULL;
p_cur = p_cur->next->next;
}
head = temp1;
new_head = temp2;
}
head = r_head;
}
Java
:
Python: