日野弥生:勉強しよう

LeetCode 328 - 奇偶链表

发表于2025年01月21日

#链表 #双指针

本题的关键在于想到把非第0位的奇数位在原位删除,并在指定位置上添加。这就要求慢指针指向插入位置的前一位,而快指针指向被选中的奇数位。

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        /* 由于快指针跳一位遍历,所以必须排除掉头指针的边界条件 */
        if(!head || !head->next)
            return head;
        
        ListNode *slow = head, *fast = head;
        while(fast && fast->next)
        {
            /* 需要记录快指针的上一位以及慢指针的下一位,即偶数链条的头和尾 */
            ListNode *fastPrev = fast->next, *slowNext = slow->next;
            fast = fast->next->next;

            /* 上一步跳两步,快指针可能为空 */
            if(fast)
            {
                slow->next = fast;
                fastPrev->next = fast->next;
                fast->next = slowNext;
            }

            slow = fast;
            fast = fastPrev;
        }
        return head;
    }
};

フラッシュタブ:LeetCode

题目链接:https://leetcode.cn/problems/odd-even-linked-list/

上一篇

LeetCode 203 - 移除链表元素

下一篇

LeetCode 234 - 回文链表