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;
}