328.奇偶链表 (Medium)*
题目描述*
给定一个单链表,把所有的奇数结点和偶数结点分别排在一起。请注意,这里的奇数结点和偶数结点指的是结点编号的奇偶性,而不是结点的值的奇偶性。
请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为结点总数。
示例*
输入: 1->2->3->4->5->NULL
输出: 1->3->5->2->4->NULL
输入: 2->1->3->5->6->4->7->NULL
输出: 2->3->6->7->1->5->4->NULL
说明*
- 应当保持奇数结点和偶数结点的相对顺序。
- 链表的第一个结点视为奇数结点,第二个结点视为偶数结点,以此类推。
代码*
创建奇偶链表头,分为填入奇偶位置的结点,最后把奇链表尾指向偶链表,注意还要把偶链表尾置空。
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == nullptr || head->next == nullptr || head->next->next == nullptr) {
return head;
}
ListNode *oddHead = new ListNode(-1), *evenHead = new ListNode(-1);
ListNode *odd = oddHead, *even = evenHead;
ListNode *p = head;
bool isOdd = true;
while(p != nullptr) {
if(isOdd) {
odd->next = p;
odd = odd->next;
isOdd = false;
}else {
even->next = p;
even = even->next;
isOdd = true;
}
p = p->next;
}
even->next = nullptr;
odd->next = evenHead->next;
return oddHead->next;
}
};
最后更新: July 23, 2022