给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes为节点总数。
示例:
输入:1->2->3->4->5->NULL
输出:1->3->5->2->4->NULL
说明:
- 应当保持奇数节点和偶数节点的相对顺序。
- 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推。
这道题分别定义两个头节点,奇数头结点:odd_head = head。偶数头结点(指向head->next的头一个节点,红色的节点):even_head->next = head->next。然后遍历一次链表,分别把奇数节点(1,3,5)和偶数节点(2,4)链接起来即可,正常情况如下所示:
由于while判断条件是对奇数节点,注意要考虑到最后单一个偶数节点问题(如下图所示)
程序如下:
ListNode* oddEvenList(ListNode* head) { if (!head || !head->next) { return head; } ListNode* odd_head = head; ListNode* even_head = new ListNode(-1); ListNode* even_head_tmp = even_head; even_head->next = head->next; while (head && head->next && head->next->next) { ListNode* tmp = head->next->next; even_head_tmp->next = head->next; even_head_tmp = even_head_tmp->next; head->next = head->next->next; head = tmp; } if (head->next) { even_head_tmp->next = head->next; even_head_tmp = even_head_tmp->next; head->next = nullptr; } even_head_tmp->next = nullptr; head->next = even_head->next; return odd_head; }