给定一个链表,对链表进行分隔,使得所有奇数都在单链表的左边,所有偶数都在单链表的右边。应当保留两个分区中每个结点的初始相对位置。
时间: 2024-02-17 22:00:43 浏览: 81
将一个结点值自然数的单链表拆分为两个单链表,原表中保留值为偶数的结点,而值为奇数的结点按它们在原表中的相对次序组成一个新的单链表
可以使用两个指针odd和even分别指向奇数节点和偶数节点的头结点,然后遍历链表,将奇数节点接在odd后面,偶数节点接在even后面,最后将odd的尾部指向even的头部即可。
具体实现可以按照以下步骤进行:
1. 初始化指针odd和even分别指向奇数节点和偶数节点的头结点。
2. 遍历链表,对于每个节点,判断其奇偶性。
3. 如果是奇数节点,将其接在odd的后面,并更新odd指针。
4. 如果是偶数节点,将其接在even的后面,并更新even指针。
5. 遍历结束后,将odd的尾部指向even的头部。
代码实现如下:
```
ListNode* oddEvenList(ListNode* head) {
if (!head || !head->next) return head; // 特判空链表和只有一个节点的链表
ListNode *odd = head, *even = head->next, *evenHead = even;
while (even && even->next) {
odd->next = even->next;
odd = odd->next;
even->next = odd->next;
even = even->next;
}
odd->next = evenHead;
return head;
}
```
时间复杂度为O(n),其中n是链表的长度。空间复杂度为O(1)。
阅读全文