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:
void reorderList(ListNode *head) {
if (head == NULL || head->next == NULL || head->next->next == NULL)
return;
ListNode *pHead = head;
stack<ListNode *> myStack;
while (pHead != NULL) {
myStack.push(pHead);
pHead = pHead->next;
}
pHead = head;
while (pHead->next != NULL && pHead->next->next != NULL) {
ListNode *pTemp, *pTempBefore;
pTemp = myStack.top();
myStack.pop();
pTempBefore = myStack.top();
myStack.pop();
pTempBefore->next = NULL;
myStack.push(pTempBefore);
pTemp->next = pHead->next;
pHead->next = pTemp;
pHead = pTemp->next;
}
}
};