Given a singly linked list, group all odd nodes together followed by the even nodes. Please note here we are talking about the node number and not the value in the nodes.html
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.node
Example:
Given 1->2->3->4->5->NULL
,
return 1->3->5->2->4->NULL
.ide
Note:
The relative order inside both the even and odd groups should remain as it was in the input.
The first node is considered odd, the second node even and so on ...post
Credits:
Special thanks to @aadarshjajodia for adding this problem and creating all test cases.this
这道题给了咱们一个链表,让咱们分开奇偶节点,全部奇节点在前,偶节点在后。咱们能够使用两个指针来作,pre指向奇节点,cur指向偶节点,而后把偶节点cur后面的那个奇节点提早到pre的后面,而后pre和cur各自前进一步,此时cur又指向偶节点,pre指向当前奇节点的末尾,以此类推直至把全部的偶节点都提早了便可,参见代码以下:url
解法一:spa
class Solution { public: ListNode* oddEvenList(ListNode* head) { if (!head || !head->next) return head; ListNode *pre = head, *cur = head->next; while (cur && cur->next) { ListNode *tmp = pre->next; pre->next = cur->next; cur->next = cur->next->next; pre->next->next = tmp; cur = cur->next; pre = pre->next; } return head; } };
还有一种解法,用两个奇偶指针分别指向奇偶节点的起始位置,另外须要一个单独的指针even_head来保存偶节点的起点位置,而后把奇节点的指向偶节点的下一个(必定是奇节点),此奇节点后移一步,再把偶节点指向下一个奇节点的下一个(必定是偶节点),此偶节点后移一步,以此类推直至末尾,此时把分开的偶节点的链表连在奇节点的链表后便可,参见代码以下;指针
解法二:code
class Solution { public: ListNode* oddEvenList(ListNode* head) { if (!head || !head->next) return head; ListNode *odd = head, *even = head->next, *even_head = even; while (even && even->next) { odd = odd->next = even->next; even = even->next = odd->next; } odd->next = even_head; return head; } };