Without using the extra space

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(!head || !head->next) return head;

        ListNode* even = head->next;
        ListNode* odd = head;
        ListNode*  evenHead = head->next;

        while(even && even->next){
            odd->next = even->next;
            odd=odd->next;

            even->next=odd->next;
            even=even->next;
        }

        odd->next=evenHead;
        return head;
    }
};

With help of extra array


class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (!head || !head->next) return head;

        // Step 1: Store values in array
        vector<int> values;
        ListNode* curr = head;
        while (curr) {
            values.push_back(curr->val);
            curr = curr->next;
        }

        // Step 2: Reorder values into odd indices first, then even
        vector<int> reordered;
        for (int i = 0; i < values.size(); i += 2) {
            reordered.push_back(values[i]);  // odd positions (1-based)
        }
        for (int i = 1; i < values.size(); i += 2) {
            reordered.push_back(values[i]);  // even positions
        }

        // Step 3: Rebuild the linked list with reordered values
        curr = head;
        for (int val : reordered) {
            curr->val = val;
            curr = curr->next;
        }

        return head;
    }
};

image.png