[算法分析与设计] leetcode 每周一题: 328. Odd Even Linked List


题目链接: 

328. Odd Even Linked List




题目大意:

给定一个单向链表, 将链表中所有奇数位(序号为 2n + 1, n ∈ N) 的节点全部移到一起, 并放在偶数位的节点的前面 ;

( 题中还注明: 要求是 O(1) 的空间复杂度 和 O(n) 的时间复杂度, n 表示节点数 ; 且各节点间的相对位置保持不变(也即要求算法稳定) ; 同时链表中第一个节点视为奇数位, 第二个则是偶数位, etc )


例如: 给定链表节点顺序关系为: 1->2->3->4->5->NULL, 则输出的应是: 1->3->5->2->4->NULL ;




解题过程:

(1) 题目意思明显, 显然是遍历进行处理 ;

(2) 考虑到链表的 "顺序" 只是逻辑上的, 且其空间占用全由链表中的节点承担, 所以可以直接用 两个子链表 分别收纳原链表中的 奇数位的节点 和 偶数位的节点, 然后分别收集链接各自所属的节点, 最后首尾相连即可 ;


(*) 容易坑的点是, 因为原链表中的节点数可能为奇数(即原先由奇数位节点结束), 所以还要显式地将 偶数位节点组成的子链表的末端 链接至 nullptr 之类的东西 以确保处理后的链表中的最后一个节点(也即原先的最后一个偶数位节点) 已经成为链表的最后一个节点 ;




代码如下:

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        auto headOdd = head;
        auto lastOdd = headOdd;
        if (headOdd == nullptr) { return headOdd; }
        auto headEven = head->next;
        auto lastEven = headEven;
        if (headEven == nullptr) { return headOdd; }
        
        auto thisEven = lastEven;
        while (thisEven != nullptr) {
            auto nextOdd = thisEven->next;
            if (nextOdd == nullptr) { break; }
            lastOdd->next = nextOdd;
            lastOdd = lastOdd->next;

            auto nextEven = nextOdd->next;
            if (nextEven == nullptr) { break; }
            lastEven->next = nextEven;
            lastEven = lastEven->next;

            thisEven = nextEven;
        }

        lastOdd->next = headEven;
        lastEven->next = nullptr;

        return headOdd;
    }
};




Runtime: 16 ms



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值