当前位置: 首页 > news >正文

LeetCode算法题(Go语言实现)_30

题目

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

一、代码实现

func oddEvenList(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    odd := head          // 奇数链表的当前尾节点
    even := head.Next    // 偶数链表的当前尾节点
    evenHead := even     // 保存偶数链表的头节点
    
    for even != nil && even.Next != nil {
        // 将下一个奇数节点链接到奇数链表尾部
        odd.Next = even.Next
        odd = odd.Next
        
        // 将下一个偶数节点链接到偶数链表尾部
        even.Next = odd.Next
        even = even.Next
    }
    
    // 将偶数链表接在奇数链表尾部
    odd.Next = evenHead
    return head
}

二、算法分析

1. 核心思路
  • 双指针分离:使用两个指针 oddeven 分别追踪奇偶链表的尾部节点,通过交替连接实现原地修改
  • 循环复用:在遍历过程中逐步构建奇偶链表,保持原始相对顺序
  • 头节点保留:通过 evenHead 保存偶数链表头节点,最终合并链表时只需一次指针操作
2. 关键步骤
  1. 初始化指针odd 指向第一个节点(奇头),even 指向第二个节点(偶头)
  2. 交替连接
    • odd 的下一个节点指向 even 的下一个节点(下一个奇数节点)
    • even 的下一个节点指向新 odd 的下一个节点(下一个偶数节点)
  3. 指针推进oddeven 同步后移,继续构建各自的链表
  4. 链表合并:将偶数链表头 evenHead 接在奇数链表尾部
3. 复杂度
指标说明
时间复杂度O(n)单次遍历,每个节点访问一次
空间复杂度O(1)仅需固定数量的指针变量

三、图解示例

在这里插入图片描述

四、边界条件与扩展

1. 特殊场景验证
  • 空链表:直接返回 nil
  • 单节点链表:返回原链表(无需处理)
  • 双节点链表:保持原顺序(奇数在前,偶数在后)
  • 长交替链表:如 R-D-R-D → 分离后奇偶顺序保持不变
2. 多语言实现
# Python实现(原地修改)
class Solution:
    def oddEvenList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        if not head or not head.next:
            return head
        odd, even, even_head = head, head.next, head.next
        while even and even.next:
            odd.next = even.next
            odd = odd.next
            even.next = odd.next
            even = even.next
        odd.next = even_head
        return head
// Java实现(指针同步移动)
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if (head == null || head.next == null) return head;
        ListNode odd = head, even = head.next, evenHead = even;
        while (even != null && even.next != null) {
            odd.next = even.next;
            odd = odd.next;
            even.next = odd.next;
            even = even.next;
        }
        odd.next = evenHead;
        return head;
    }
}

五、总结与扩展

1. 核心创新点
  • 链式跳跃:通过 odd.next = even.next 直接跳过偶数节点,避免多次遍历
  • 数学归纳法证明:奇数节点的下一个节点总是偶数节点的下一个节点,确保正确性
2. 扩展应用
  • 多级分离:扩展为分离模3余数不同的节点(如余0、1、2)
  • 双向链表:修改指针操作逻辑支持双向遍历
  • 环形链表检测:结合快慢指针检测环的存在
3. 工程优化方向
  • 内存预分配:预先计算链表长度优化指针操作
  • 并发安全:添加锁机制支持多线程环境下的链表操作
http://www.dtcms.com/a/112079.html

相关文章:

  • AcWing 6135. 奶牛体检
  • 【Java集合】LinkedList源码深度分析
  • Nature Electronics|一种透气、可拉伸的液态金属基3D电子皮肤系统(健康监测/可穿戴电子/透汗透气性电子/电子皮肤/柔性电子/集成电路)
  • 降维算法之PCA(主成分分析)
  • 函数和模式化——python
  • 文件系统-重定向
  • 架构思维:冷热分离 - 表数据量大读写缓慢的优化方案
  • 有没有可以帮助理解高数的视频或者书籍资料?
  • 【力扣hot100题】(050)岛屿数量
  • 消息队列之-Kafka
  • #Linux内存管理# 在ARM32bit Linux中,高端内存的起始地址是如计算出来的?
  • 思二勋:未来所有的业务都将生于AI、长于AI、成于AI
  • 搜索二维矩阵
  • 笔记:代码随想录算法训练营day65:dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
  • Docker安装、配置Redis
  • 使用Expo框架开发APP——详细教程
  • 【JavaScript】原型链 prototype 和 this 关键字的练习(老虎机)
  • 安当TDE透明加密:构建跨地域文件服务器安全传输的“双重保险“
  • VBA中类的解读及应用第二十二讲:利用类判断任意单元格的类型-5
  • C语言:3.31
  • 【YOLO系列(V5-V12)通用数据集-火灾烟雾检测数据集】
  • 大模型学习四:‌DeepSeek Janus-Pro 多模态理解和生成模型 本地部署指南(折腾版)
  • 七均线策略思路
  • Mac VM 卸载 win10 安装win7系统
  • Win7下安装高版本node.js 16.3.0 以及webpack插件的构建
  • Apache Camel指南-第四章:路由径构建之异常处理
  • 如何使用 IntelliJ IDEA 开发命令行程序(或 Swing 程序)并手动管理依赖(不使用 pom.xml)
  • 从飞机的状态矩阵A阵求运动模态的特征根、求传递函数矩阵
  • NOIP2013提高组.华容道
  • 从菜鸟到高手的提示词优化指南‌