1.题目描述
https://leetcode.com/problems/odd-even-linked-list/#/description
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 …Credits:
Special thanks to @DjangoUnchained for adding this problem and creating all test cases.Subscribe to see which companies asked this question.
2. 基本思路
这道题目虽然标记是medium类型的题目,但是,感觉还是非常easy,基本思路就是使用两个指针,通过一次遍历将奇数项划分到一个队列,将偶数项划分到另一个队列,然后把这两个队列链接起来即可。
3. 实现代码
/**
* 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) {
ListNode hodd(0), heven(0);
ListNode * odd = &hodd, *even = &heven;
while (head){
odd->next = head;
odd = odd->next;
head = head->next;
odd->next = nullptr;
if (head){
even->next = head;
even = even->next;
head = head->next;
even->next = nullptr;
}
}
odd->next = heven.next;
return hodd.next;
}
};
实现效果:
ps:为了方便测试,我们编写了一个用于构建列表的构建函数和打印链表的打印函数:
ListNode * createList(istringstream & iss){
string line;
ListNode head(0);
ListNode * phead = &head;
while (getline(iss, line, '#')){
if (line != "!"){
phead->next = new ListNode(stoi(line));
phead = phead->next;
phead->next = nullptr;
}
}
return head.next;
}
void printList(ListNode * head, ostringstream & oss){
while (head){
oss << head->val << " ";
head = head->next;
}
oss << endl;
}
测试代码如下:
TEST(Solution, func){
Solution s;
istringstream iss("1#2#3#4#5#!#");
auto list1 = createList(iss);
ostringstream oss, oss1;
printList(list1, oss);
auto list = s.oddEvenList(list1);
printList(list, oss1);
EXPECT_EQ(oss1.str(), "1 3 5 2 4 \n");
istringstream iss1("");
auto list2 = createList(iss);
ostringstream oss2, oss3;
printList(list2, oss2);
auto list3 = s.oddEvenList(list2);
printList(list3, oss3);
EXPECT_EQ(oss3.str(), "\n");
}
4. 参考代码
https://leetcode.com/articles/odd-even-linked-list/
类似的实现思想
public class Solution {
public ListNode oddEvenList(ListNode head) {
if (head == null) return null;
ListNode odd = head, even = head.next, evenHead = even;
while (even != null && even.next != null) {
odd.next = even.next;
odd = odd.next;
even.next = odd.next;
even = even.next;
}
odd.next = evenHead;
return head;
}
}