1. 题目

描述

给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。

注意是节点的编号而非节点的数值。

数据范围:节点数量满足 0≤n≤10^5^,节点中的值都满足 0≤val≤10000

要求:空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

{1,2,3,4,5,6}

返回值:

{1,3,5,2,4,6}

说明:

1->2->3->4->5->6->NULL
重排后为1->3->5->2->4->6->NULL

示例2

输入:

{1,4,6,3,7}

返回值:

{1,6,7,4,3}

说明:

1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数位节点有1,6,7,偶数位节点有4,3。重排后为1,6,7,4,3

备注:

链表长度不大于200000。每个数范围均在int内。

2. 解题思路

对链表的奇偶节点进行排序,就是要更改奇数节点与偶数节点的指针域。让奇数节点的指针域指向下下节点(奇数节点指向奇数节点),偶数节点的指针域也是指向下下节点(偶数节点指向偶数节点)。最后再将奇数节点中最后一个节点的指针域指向偶数节点中的第一节点。

为了便于操作偶数节点只的第一个节点,需要定义一个虚拟头节点,此虚拟头节点的指针域指向偶数节点中的第一个节点(这样就很容易找到偶数节点的第一个节点了)。

假如排序的链表如下所示,可以通过下面的步骤完成链表奇偶节点的排序。

步骤一:定义虚拟头结点与指针变量。

分别定义奇数节点操作指针变量oddCur和偶数节点操作指针变量evenCur,以及虚拟头节点tmpHead。变量指向如下图所示:

步骤二:移动指针变量。

  • 更改奇数节点指针域的指向

  • 更改偶数节点指针域的指向

指针变量移动终止条件:

  • 节点数量为奇数的情况:

  • 节点数量为偶数的情况:

步骤三:奇数节点连接 偶数节点链表的头节点,形成一个新的链表。

如果文字描述的不太清楚,你可以参考视频的详细讲解。

3. 编码实现

核心伪代码如下:

函数 oddEvenList(头节点 head) 返回链表节点:
    如果 head 为空:
        返回 head
    
    // 1.定义虚拟头结点与指针变量
    odd_cur = head          // 当前奇数节点指针,初始指向头节点
    even_cur = head.next    // 当前偶数节点指针,初始指向第二个节点
    tmp_head = 新建节点(-1)  // 偶数链的虚拟头节点
    tmp_head.next = even_cur // 虚拟头节点指向偶数链头部
    
    // 2. 移动指针变量(遍历并分离奇偶节点)
    当 even_cur 不为空 且 even_cur.next 不为空:
        // 2.1 更改奇数节点的指针指向
        odd_cur.next = odd_cur.next.next
        odd_cur = odd_cur.next
        
        // 2.2 更改偶数节点的指针域
        even_cur.next = even_cur.next.next
        even_cur = even_cur.next
    
    // 3. 奇数节点连接 偶数节点链表的头节点,形成一个新的链表(将奇数链尾部连接到偶数链头部)
    odd_cur.next = tmp_head.next
    //4. 返回新链表的头节点(新链表的头节点为:奇数节点链表的头结点,即原链表的头节点)
    返回 head  // 新链表头部仍为原始头节点

具体完整代码你可以参考下面视频的详细讲解。

4.小结

对链表的奇偶节点进行排序,就是要更改奇数节点与偶数节点的指针域。让奇数节点的指针域指向下下节点(奇数节点指向奇数节点),偶数节点的指针域也是指向下下节点(偶数节点指向偶数节点)。最后再将奇数节点中最后一个节点的指针域指向偶数节点中的第一节点。


《数据结构与算法》深度精讲课程正式上线啦!七大核心算法模块全解析:

✅ 链表 ✅ 二叉树 ✅二分查找、排序 ✅ 堆、栈、队列 ✅回溯算法 ✅ 哈希算法 ✅ 动态规划

无论你是备战笔试面试、提升代码效率,还是突破技术瓶颈,这套课程都将为你构建扎实的算法思维底座。🔥立即加入学习打卡,与千名开发者共同进阶!

对于链表的相关操作,我们总结了一套【可视化+图解】方法,依据此方法来解决链表相关问题,链表操作变得易于理解,写出来的代码可读性高也不容易出错。具体也可以参考视频详细讲解。

今日佳句:会当凌绝顶,一览众山小。


好易学数据结构
1 声望0 粉丝