分享

617,奇偶链表

 数据结构和算法 2023-06-10 发布于上海

问题描述



来源:LeetCode第328题

难度:中等

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

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

示例 1:

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

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

示例 2:

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

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

说明:

  • 应当保持奇数节点和偶数节点的相对顺序。

  • 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。

问题分析



这题是让把链表的奇数节点和偶数节点单独分开,我们自然想到的是把奇数节点串到一起,我们称之为奇数链表,偶数节点串到一起,我们称之为偶数链表。最后再把偶数链表挂到奇数链表的后面即可。如下图所示

串完之后分开来看就是下面这样

注意这里需要使用几个变量,分别记录奇数链表的头节点和尾节点,偶数链表的头节点和尾节点。关于链表的题直接看不太容易理解,画图是解链表相关题的最好方式。我们来看下代码

public ListNode oddEvenList(ListNode head) {
    if (head == null || head.next == null)
        return head;
    //奇数链表的头节点
    ListNode oddHead = head;
    //奇数链表的当前节点
    ListNode oddCur = oddHead;

    //偶数链表的头节点
    ListNode evenHead = head.next;
    //偶数链表的当前节点
    ListNode evenCur = evenHead;

    while (evenCur != null && evenCur.next != null) {
        //奇数节点串一起
        oddCur.next = oddCur.next.next;
        //偶数节点串一起
        evenCur.next = evenCur.next.next;
        //奇偶指针往后移
        oddCur = oddCur.next;
        evenCur = evenCur.next;
    }
    //最后偶数链表和奇数链表需要串在一起
    oddCur.next = evenHead;
    return oddHead;
}

596,删除排序链表中的重复元素 II

595,删除排序链表中的重复元素

554,反转链表 II

502,分隔链表的解决方式

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多