LeetCode 328. Odd Even Linked List 解题笔记

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值