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.


这题比较简单。就是将奇数节点和偶数节点进行分离,然后奇数串在一起,偶数串在一起,最后偶数跟在奇数的后面就好了。使用一个int变量从1开始进行+1,就可以使用对2取模运算根据计算结果是1还是0就好了。然后分别将奇数偶数串起来就好了,需要注意一下最后一个偶数节点(因为偶数在奇数后面)可能next指向的不为空,这时候需要手动赋值为空。

#include <iostream>
#include <unordered_set>
using namespace std;

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        if(!head) {
            return NULL;
        }

        ListNode* oddNode = NULL;//奇数节点
        ListNode* evenNode = NULL;//偶数节点
        ListNode* p1;
        ListNode* p2;
        int num = 1;

        while(head) {
            if(num%2 == 1) {//奇数节点
                if(!oddNode) {
                    oddNode = head;
                } else {
                    p1->next = head;
                }
                p1 = head;
            }
            if(num%2 == 0) {//偶数节点
                if(!evenNode) {
                    evenNode = head;
                } else {
                    p2->next = head;
                }
                p2 = head;
            }
            //cout << p1->val << ",";
            //cout << p2->val << endl;
            head = head->next;
            num++;
        }
        //cout << p1->val << ",";
        //cout << p2->val << endl;
        //cout << oddNode->val << ",";
        //cout << evenNode->val << endl;
        p1->next = evenNode;
        p2->next = NULL;
        return oddNode;
    }
};

int main() {
    Solution s;


    ListNode node1(1);
    ListNode node2(2);
    ListNode node3(3);
    ListNode node4(4);
    ListNode node5(5);

    node1.next = &node2;
    node2.next = &node3;
    node3.next = &node4;
    node4.next = &node5;

    ListNode* p = s.oddEvenList(&node1);

    while(p) {
        cout << p->val;
        cout << endl;
        p = p->next;
    }

}


运行结果可能有误差。

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值