【Leetcode】328. 奇偶链表

地址:328. 奇偶链表

题目

给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。

第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。

请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。

你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。

示例

 

思路

1. 若链表为空,则直接返回空

2. head节点即为奇数链表的头节点,head->next是偶数链表的头节点(evenhead)

3. 令2个指针odd , even分别指向奇数 / 偶数节点 ,初始化时令odd = head,even = evenhead

4. 迭代过程中先更新奇数节点再更新偶数节点。

  •         更新奇数节点时:奇数节点的下一个节点为当前偶数节点的下一个节点,即odd->next = even->next,后更新odd = odd->next,此时odd位置为even的后一个节点
  •         更新偶数节点时:(同奇数节点)even->next = odd->next,更新even = even->next,此时even节点为odd的后一个节点

5. 上述操作结束以后,可以分离奇偶节点。分离完毕的判断条件为:even == NULL  or  even ->next == NULL,因为每次都会先更新奇数节点,奇数节点的更新条件为:odd->next = even->next,自然是与even有关,所以会先进行even是否为空的判断。

6. 若此时even / even->next为空,那么odd会指向奇数链表的最后一个节点。此时需要奇偶链表首尾相接,即odd - > next = evenhead.

代码 

class Solution {
public:
    ListNode* oddEvenList(ListNode* head) {
        int t = 1;
        if(head==NULL)  return head;
        ListNode *evenhead = head->next;
        ListNode *odd = head,*even = evenhead;
        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;
    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值