📜  给定单链表的交替分割 |设置 1(1)

📅  最后修改于: 2023-12-03 15:41:16.522000             🧑  作者: Mango

给定单链表的交替分割 |设置 1

本题要求对给定的单链表进行交替分割操作,将原链表拆分为奇数位节点组成的新链表和偶数位节点组成的新链表两个部分。

问题描述

假设有一个链表 head,其单链表头节点为 head->next。将该链表交替拆分为奇数链表 odd 和偶数链表 even,即将链表头部的第一个元素赋值为 odd->next=head->next,再将链表头部的第二个元素赋值为 even->next=odd->next->next,然后依次往下取奇数和偶数元素放入 odd 和 even链表中即可。

示例

例如,对于给定的链表 head 的元素顺序为 1->2->3->4->5->NULL,我们可以对其进行如下操作:

  • 将链表 head 的奇数节点组成的新链表 odd 的头节点赋值为 head->next;
  • 将链表 head 的偶数节点组成的新链表 even 的头节点赋值为 odd->next->next;
  • 对于每个奇数的位置 i,将其的后继节点(即第 i+2 个节点)赋值为 odd->next,并将 odd 的后继节点指向 odd->next;
  • 对于每个偶数的位置 j,将其的后继节点(即第 j+2 个节点)赋值为 even->next,并将 even 的后继节点指向 even->next。

最终,我们可以得到两个新链表 odd 和 even,其元素顺序分别为 1->3->5->NULL 和 2->4->NULL。

代码实现

可以使用两个指针 odd 和 even 分别指向两个新链表的头节点,同时使用两个辅助指针 odd_tail 和 even_tail 分别指向当前节点添加到新链表中的最后一个位置。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if (head == nullptr) {
            return head;
        }
        ListNode* odd = head;
        ListNode* even = head->next;
        ListNode* even_head = even;
        while (even != nullptr && even->next != nullptr) {
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next;
        }
        odd->next = even_head;
        return head;
    }
};

以上代码使用两个指针 odd 和 even 分别指向两个新链表的头节点,然后使用 while 循环一次遍历链表,交替将奇数位节点与偶数位节点添加到不同的新链表中。其中,even_head 记录了偶数位链表的头节点,最后将 odd 链表的结尾节点指向 even_head 即可。