奇偶链表-力扣328

111 阅读1分钟

奇偶链表-力扣328

两种情况:

第一种: 1 2 3 4 5, 最后一个结点是odd

第二种: 1 2 3 4 5 6, 最后一个结点是even

用evenHead标记偶子列的开始结点,head可以直接表示奇子列的开始结点。通过odd和even指针向后不停修改奇偶子列结点的指针来构建两个奇偶子列。需要注意的是,最后得依据上面的两种情况来处理好odd和even的指向关系,防止空指针。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(head == nullptr) return head;

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

        while(evenHead != nullptr && even != nullptr){
            cout << "odd: " << odd->val << "   even: " << even->val << endl;

            odd->next = even->next;
            if(odd->next == nullptr) //如果链表结点的最后一个是even
                break;
            else odd = even->next;

            if(odd != nullptr){
                even->next = odd->next;
                even = even->next;
            } else {
                even->next = nullptr;
                even = nullptr;
            }
        }

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

时间复杂度: O(n)O(n)

空间复杂度: O(1)O(1)