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}
.
#include <malloc.h> struct ListNode { int val; ListNode* next; ListNode(int x) : val(x), next(0){} }; ListNode* reverseList(ListNode* pList, ListNode* &head) { if (0 == pList || 0 == pList->next) { head = pList; return pList; } ListNode* tmp = reverseList(pList->next, head); tmp->next = pList; pList->next = 0; return pList; } void reorderList(ListNode *head) { if (0 == head || 0 == head->next) return; ListNode* slow = head; ListNode* fast = head; while(0 != fast->next && 0 != fast->next->next) { slow = slow->next; fast = fast->next->next; } ListNode* head2 = 0; ListNode* tail = reverseList(slow->next, head2); slow->next = 0; ListNode* dummy = (ListNode*)malloc(sizeof(ListNode)); dummy->next = head; ListNode* dummybk = dummy; while(0 != head|| 0 != head2) { if (0 != head) { dummy->next = head; head = head->next; dummy = dummy->next; } if (0 != head2) { dummy->next = head2; head2 = head2->next; dummy = dummy->next; } } head = dummybk->next; delete dummybk; } int main(int argc, char* argv[]) { ListNode* head = (ListNode*)malloc(sizeof(ListNode)); ListNode* tmp = head; head->val = 1; for (int i = 2; i < 8; i++) { ListNode* newNode = (ListNode*)malloc(sizeof(ListNode)); newNode->val = i; newNode->next = 0; tmp->next = newNode; tmp = tmp->next; } reorderList(head); return 0; }