两种情况:
第一种: 1 2 3 4 5, 最后一个结点是odd
第二种: 1 2 3 4 5 6, 最后一个结点是even
用evenHead标记偶子列的开始结点,head可以直接表示奇子列的开始结点。通过odd和even指针向后不停修改奇偶子列结点的指针来构建两个奇偶子列。需要注意的是,最后得依据上面的两种情况来处理好odd和even的指向关系,防止空指针。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == nullptr) return head;
ListNode *odd = head;
ListNode *even = head->next, *evenHead = head->next;
while(evenHead != nullptr && even != nullptr){
cout << "odd: " << odd->val << " even: " << even->val << endl;
odd->next = even->next;
if(odd->next == nullptr) //如果链表结点的最后一个是even
break;
else odd = even->next;
if(odd != nullptr){
even->next = odd->next;
even = even->next;
} else {
even->next = nullptr;
even = nullptr;
}
}
odd->next = evenHead;
return head;
}
};
时间复杂度:
空间复杂度: