跳转至

328.奇偶链表 (Medium)*

题目描述*

给定一个单链表,把所有的奇数结点和偶数结点分别排在一起。请注意,这里的奇数结点和偶数结点指的是结点编号的奇偶性,而不是结点的值的奇偶性。

请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为结点总数。

示例*

输入: 1->2->3->4->5->NULL

输出: 1->3->5->2->4->NULL

输入: 2->1->3->5->6->4->7->NULL

输出: 2->3->6->7->1->5->4->NULL

说明*

  • 应当保持奇数结点和偶数结点的相对顺序。
  • 链表的第一个结点视为奇数结点,第二个结点视为偶数结点,以此类推。

代码*

创建奇偶链表头,分为填入奇偶位置的结点,最后把奇链表尾指向偶链表,注意还要把偶链表尾置空。

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(head == nullptr || head->next == nullptr || head->next->next == nullptr) {
            return head;
        }
        ListNode *oddHead = new ListNode(-1), *evenHead = new ListNode(-1);
        ListNode *odd = oddHead, *even = evenHead;
        ListNode *p = head;
        bool isOdd = true;
        while(p != nullptr) {
            if(isOdd) {
                odd->next = p;
                odd = odd->next;
                isOdd = false;
            }else {
                even->next = p;
                even = even->next;
                isOdd = true;
            }
            p = p->next;
        }
        even->next = nullptr;
        odd->next = evenHead->next;
        return oddHead->next;
    }
};

最后更新: July 23, 2022