【LeetCode】328. 奇偶链表

328. 奇偶链表(中等)

思路

  • 如果链表为空,则直接返回链表。

  • 对于原始链表,每个节点都是奇数节点或偶数节点。头节点是奇数节点,头节点的后一个节点是偶数节点,相邻节点的奇偶性不同。因此可以将奇数节点和偶数节点分离成奇数链表和偶数链表,然后将偶数链表连接在奇数链表之后,合并后的链表即为结果链表。

  • 原始链表的头节点 head 也是奇数链表的头节点以及结果链表的头节点,head 的后一个节点是偶数链表的头节点。令 evenHead = head->next,则 evenHead 是偶数链表的头节点。

  • 维护两个指针 odd 和 even 分别指向奇数节点和偶数节点,初始时 odd = head,even = evenHead。通过迭代的方式将奇数节点和偶数节点分离成两个链表,每一步首先更新奇数节点,然后更新偶数节点。

  • 在上述操作之后,即完成了对一个奇数节点和一个偶数节点的分离。重复上述操作,直到全部节点分离完毕。全部节点分离完毕的条件是 even 为空节点或者 even->next 为空节点,此时 odd 指向最后一个奇数节点(即奇数链表的最后一个节点)。

  • 最后令 odd->next = evenHead,将偶数链表连接在奇数链表之后,即完成了奇数链表和偶数链表的合并,结果链表的头节点仍然是 head。

代码

cpp 复制代码
/**
 * 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) return head;
        ListNode *EvenHead = head->next;
        ListNode *odd = head, *even = head->next;
        while(odd && even && odd->next && even->next) {
            odd->next = even->next;
            even->next = even->next->next;
            odd = odd->next;
            even = even->next;
        }
        odd->next = EvenHead;
        return head;
    }
};

参考资料

  1. 力扣官方题解
相关推荐
CoovallyAIHub5 分钟前
YOLO-Maste开源:首个MoE加速加速实时检测,推理提速17.8%!
深度学习·算法·计算机视觉
清铎9 分钟前
leetcode_day13_普通数组_《绝境求生》
数据结构·算法
hetao173383719 分钟前
2026-01-09~12 hetao1733837 的刷题笔记
c++·笔记·算法
过河卒_zh15667661 小时前
情感型AI被“立规矩”,AI陪伴时代进入下半场
人工智能·算法·aigc·生成式人工智能·算法备案
wefg11 小时前
【算法】动态规划
算法·动态规划
机器学习之心1 小时前
198种组合算法+优化TCN-Transformer+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
深度学习·算法·transformer·shap分析·新数据预测
狐571 小时前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
Gorgous—l1 小时前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
小郭团队1 小时前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
瑞雨溪1 小时前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展