import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 *   public ListNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param head ListNode类
     * @return ListNode类
     */
    public ListNode oddEvenList (ListNode head) {
        // write code here
        if (null == head) {
            return null;
        }

        Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
        ListNode cur = head;
        int index = 0;
        while (cur != null) {
            index++;
            if (index % 2 == 0) {
                // 偶数位结点
                if (map.containsKey("even")) {
                    List<Integer> evenList =  map.get("even");
                    evenList.add(cur.val);
                    map.put("even", evenList);
                } else {
                    List<Integer>  evenList =   new ArrayList<>();
                    evenList.add(cur.val);
                    map.put("even", evenList);
                }
            } else {
              // 奇数位结点
                if (map.containsKey("odd")) {
                    List<Integer> oddList =  map.get("odd");
                    oddList.add(cur.val);
                    map.put("odd", oddList);
                } else {
                    List<Integer>  oddList =   new ArrayList<>();
                    oddList.add(cur.val);
                    map.put("odd", oddList);
                }
            }
            cur = cur.next;

        }

        ListNode oddHead = null;
        ListNode odd = null;
        ListNode evenHead = null;
        ListNode even = null;
        for (Map.Entry<String, List<Integer>> entry : map.entrySet()) {
            String key = entry.getKey();
            List<Integer> value = entry.getValue();
            if ("odd".equals(key)) {
                for (int i = 0; i < value.size(); i++) {
                    ListNode node =  new ListNode(value.get(i));
                    if (0 == i) {
                        oddHead = node;
                        odd = node;
                    } else {
                        odd.next = node;
                        odd = node;
                    }
                }
            } else {
                for (int i = 0; i < value.size(); i++) {
                    ListNode node =  new ListNode(value.get(i));
                    if (0 == i) {
                        evenHead = node;
                        even = node;
                    } else {
                        even.next = node;
                        even = node;
                    }
                }
            }
        }

        odd.next = evenHead;
        return oddHead;
    }
}

将奇数位和偶数位的结点有list存储起来,最后分别组装奇数位和偶数位结点链表形成新链表。