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}
.
这个题是一个模板题,融合了find_mid, reverse以及mid
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void reorderList(ListNode* head) {
if (head == NULL) {
return;
}
ListNode* mid = find_mid(head);
ListNode* tail = reverse(mid->next);
mid->next = NULL;
merge(head, tail);
}
private:
ListNode* find_mid(ListNode* head) {
if (head == NULL) {
return head;
}
ListNode* slow = head;
ListNode* fast = head;
while (fast != NULL && fast->next != NULL) {
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
ListNode* reverse(ListNode* node) {
ListNode *prev = NULL;
while (node != NULL) {
ListNode* tmp = node->next;
node->next = prev;
prev = node;
node = tmp;
}
return prev;
}
void merge(ListNode* head, ListNode * tail) {
ListNode* dummy = new ListNode(0);
ListNode* node = dummy;
int num = 0;
while (head != NULL && tail != NULL) {
if (num % 2 == 0) {
node->next = head;
head = head->next;
node = node->next;
}
else {
node->next = tail;
tail = tail->next;
node = node->next;
}
num++;
}
if (head != NULL) {
node->next = head;
}
if (tail != NULL) {
node->next = tail;
}
head = dummy->next;
}
};