# Odd Even Linked List

Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.

You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.

**Example 1:**

```
Input: 1->2->3->4->5->NULL
Output: 1->3->5->2->4->NULL
```

**Example 2:**

```
Input: 2->1->3->5->6->4->7->NULL
Output: 2->3->6->7->1->5->4->NULL
```

**Note:**

* The relative order inside both the even and odd groups should remain as it was in the input.
* The first node is considered odd, the second node even and so on ...

这道题无论node的数量是奇数还是偶数，最后退出while循环的时候，odd指向的肯定是偶数node的最后一个，因为一开始记录下来了even node的起始位置，所以最后将他们连在一起就可以了,不过我写的while循环太麻烦了，其实只需要考虑even和even的下一个是不是空就好了

* Time complexity : O(n)O(n). There are total nn nodes and we visit each node once.
* Space complexity : O(1)O(1). All we need is the four pointers.

```java
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head == null || head.next == null){
            return head;
        }
        
        ListNode odd  = head, even = head.next, evenStart = even;
        
        
        while(true){
            odd.next = even.next;
            if(odd.next != null){
                odd = odd.next;
            }else{
                break;
            }
            
            even.next = odd.next;
            if(even.next != null){
                even = even.next;
            }else{
                break;
            }
        }
        
        odd.next = evenStart;
        return head;
        
    }
}
```

```java
public class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null) return null;
        ListNode odd = head, even = head.next, evenHead = even;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}
```
