328. Odd Even Linked List 题解
题目描述:
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.
You should try to do it in place. The program should run in O(1) space complexity and O(nodes) time complexity.
Example:
Given 1->2->3->4->5->NULL
,
return 1->3->5->2->4->NULL
.
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 ...
题目链接:328. Odd Even Linked List
算法描述:
由题意知,给定一个元素从1 至 n 的初始链表,要求对初始链表进行重新排序,使得奇数在前,偶数在后,依然需要保证奇数偶数分别递增排列,空间复杂度为 “O (1)”。
当链表为空或者链表中元素小于 3 时,直接返回链表。
题目要求空间复杂度为“O (1)” ,因此我们只能在原链表中进行操作。我们从头开始遍历链表,因为链表元素的排列方式为 “奇 - 偶 - 奇 - 偶····” ,因此我们仅需要操作链表长度的二分之一次即可。我们需要设置一个尾指针 “end” 帮助我们当遍历到偶数时将该偶数置于尾部。最后需要注意,结果链表最后一个元素为 “NULL”。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* oddEvenList(ListNode* head) {
if(head == NULL){
return head;
}
ListNode* p = head;
int cnt = 1;
while(p->next != NULL){
cnt++;
p = p->next;
}
if(cnt < 3){
return head;
}
ListNode* end = p;
ListNode* ct = head;
for(int i = 0; i < cnt/2; i++){
ListNode* temp = ct->next;
ct->next = temp->next;
end->next = temp;
temp->next = NULL;
end = temp;
ct = ct->next;
}
return head;
}
};