/*
* Solution.cpp
*
* Created on: 2014年4月9日
* Author: William
*/
#include <iostream>
using namespace std;
// Definition for singly-linked list.
struct ListNode {
int val;
ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
class Solution {
public:
// The important part of this problem is to make the reverse function O(n) instead of O(n2).
ListNode* reverseList(ListNode* head) {
if (head == NULL || head->next == NULL)
return head;
ListNode* tmphead = reverseList(head->next);
head->next->next = head;
head->next = NULL;
return tmphead;
}
void reorderList(ListNode *head) {
// Find the mid point.
int size = 0;
ListNode *tail = head, *mid = head;
while (tail != NULL) {
tail = tail->next;
size++;
}
if (size < 3)
return;
for (int i = 0; i < size / 2; i++)
mid = mid->next;
// reverse the last half.
ListNode *rest = mid->next;
rest = reverseList(rest);
mid->next = rest;
// Reorder
ListNode *p = head, *cur = mid;
while (rest != NULL) {
cur->next = rest->next;
rest->next = p->next;
p->next = rest;
p = p->next->next;
rest = cur->next;
}
}
void printList(ListNode *head) {
ListNode *p = head;
while (p != NULL) {
cout << p->val << " ";
p = p->next;
}
cout << endl;
}
};
int main() {
Solution pro;
ListNode l1 = ListNode(1);
ListNode l2 = ListNode(2);
l1.next = &l2;
ListNode l3 = ListNode(3);
l2.next = &l3;
ListNode l4 = ListNode(4);
l3.next = &l4;
ListNode l5 = ListNode(5);
l4.next = &l5;
ListNode l6 = ListNode(6);
l5.next = &l6;
ListNode l7 = ListNode(7);
l6.next = &l7;
pro.printList(&l1);
pro.reorderList(&l1);
pro.printList(&l1);
return 0;
}