public static Node<Integer> reOrder(Node<Integer> head) {

        //take care of zero size and single size lists
        if(head == null || head.next == null) {
            return head;
        }

        // first break the list into two equal parts and reverse the later part
        Node<Integer> slow = head;
        Node<Integer> fast = head;
        Node<Integer> prev = null;

        while(fast!= null && fast.next!= null) {
            prev = slow;
            slow = slow.next;
            fast = fast.next.next;
        }
        // break the list
        prev.next = null;

        Node<Integer> leftHead = head;
        Node<Integer> rightHead = reverse(slow);

        // interleave both the lists
        while(leftHead!= null && rightHead!= null) {
            Node<Integer> temp = leftHead.next;
            leftHead.next = rightHead;
            leftHead = leftHead.next;
            rightHead = temp;
        }

        return head;
    }