📅  最后修改于: 2023-12-03 15:41:16.522000             🧑  作者: Mango
本题要求对给定的单链表进行交替分割操作,将原链表拆分为奇数位节点组成的新链表和偶数位节点组成的新链表两个部分。
假设有一个链表 head,其单链表头节点为 head->next。将该链表交替拆分为奇数链表 odd 和偶数链表 even,即将链表头部的第一个元素赋值为 odd->next=head->next,再将链表头部的第二个元素赋值为 even->next=odd->next->next,然后依次往下取奇数和偶数元素放入 odd 和 even链表中即可。
例如,对于给定的链表 head 的元素顺序为 1->2->3->4->5->NULL,我们可以对其进行如下操作:
最终,我们可以得到两个新链表 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 即可。