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}
.
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode* head) {
ListNode* prev = NULL, *cur = head, *next = NULL;
while (cur != NULL) {
next = cur->next;
cur->next = prev;
prev = cur;
cur = next;
}
return prev;
}
void reorderList(ListNode *head) {
if (head == NULL || head->next == NULL || head->next->next == NULL)
return;
ListNode *slow = head, *fast = head;
while (fast != NULL && fast->next != NULL && fast->next->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
ListNode *l2 = reverse(slow->next), *l1 = head, *l1next = NULL, *l2next = NULL;
slow->next = NULL;
while (l2 != NULL) {
l1next = l1->next;
l1->next = l2;
l2next = l2->next;
l2->next = l1next;
l1 = l1next;
l2 = l2next;
}
}
};
Reverse the second half string.