public void reorderList(ListNode head) {
        // deal with the trivial case when head is null
        if ( head == null || head.next == null ) {
            return;
        }
        // 1. find the first element that should moved forward 
        ListNode         p  =  findMover(head);
        Stack<ListNode>		s  =  new Stack<>();
        while ( p != null ){
        	s.push( p );
        	p  =  p.next;
        }
        
        // 2. do recursion
        ListNode	iter  =  head;
        while ( !s.isEmpty() ) {
        	ListNode	n  =  s.pop();
        	n.next  =  iter.next;
        	iter.next  =  n;
        	iter  =  iter.next.next;
        }
    }