奇偶链表-力扣328-C++

目录

一、题目描述

二、运行结果

三、解题思路

四、代码


一、题目描述

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

示例 1:

奇偶链表-力扣328-C++_第1张图片 

输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
示例 2:

奇偶链表-力扣328-C++_第2张图片 

输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/odd-even-linked-list

二、运行结果

 

三、解题思路

题目要求将原来的一个链表按节点的索引分为奇偶两个链表,且链表直接要保持节点原来的顺序,

这里采用类似尾插法的方式构造两个链表(奇链表和偶链表),所以首先需要设置两个链表的尾指针,另外,最后两个链表要合并,所以要先保存偶链表的首节点。然后开始遍历原链表中的结点:

可以采用如下遍历方式:每次奇链表尾指针的next域先指向偶链表尾指针的下一个结点,然后奇链表的尾指针向后移一个位置;偶链表指针的next域指向奇链表尾指针的下一个结点,然后偶链表尾指针后移一个位置;直至其中一个链表的指针指向为空。

最后将奇链表的尾结点和偶链表的首节点连接起来即可。

四、代码

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(head == nullptr || head->next == nullptr)
            return head;

        ListNode* oddRear = head; //奇数链表已排好的最后一个节点
        ListNode* evenHead = head->next;//偶数链表已排好的第一个节点
        ListNode* evenRear = head->next;//偶数链表已排好的最后一个节点

        while(evenRear != nullptr && evenRear->next != nullptr){
            oddRear->next = evenRear->next;  //奇数链表和偶数链表尾指针各向后移一个位置
            oddRear = oddRear->next;
            evenRear->next = oddRear->next;
            evenRear = evenRear->next;
        }
        oddRear->next = evenHead;  //将奇数链表的最后一个节点接到偶数链表的第一个节点
        return head;
    }
};

你可能感兴趣的:(#,力扣-C++,链表,c++,力扣,奇偶)