【Leetcode】2074. 反转偶数长度组的节点

地址:2074. 反转偶数长度组的节点

题目

给你一个链表的头节点 head 。

链表中的节点 按顺序 划分成若干 非空 组,这些非空组的长度构成一个自然数序列(1, 2, 3, 4, ...)。一个组的 长度 就是组中分配到的节点数目。换句话说:

  • 节点 1 分配给第一组
  • 节点 2 和 3 分配给第二组
  • 节点 45 和 6 分配给第三组,以此类推

注意,最后一组的长度可能小于或者等于 1 + 倒数第二组的长度 。

反转 每个 偶数 长度组中的节点,并返回修改后链表的头节点 head 。

示例

思路

1. 注意这里的奇偶指的是每一组包含元素个数的奇偶,而不是(第几组)组数的奇偶

2.利用vector容器存入每个节点后再反转,直接在链表上反转不容易实现。

3.反转后将vector中的每个元素依次赋值给链表中的节点即可

 

代码

class Solution {
public:
    ListNode* reverseEvenLengthGroups(ListNode* head) {
        if(head==NULL)  return head;
        vector<int> rev;
        ListNode *p = head;
        //将链表中的元素依次存入vector中
        while(p){
            rev.push_back(p->val);
            p = p->next;
        }
        int len = rev.size(),dis = 1,start=0;
        while(start + dis < len){
            if(dis % 2 == 0){   //需要反转
                reverse(rev.begin()+start,rev.begin()+start+dis);
            }
            start += dis;
            dis++;  //在长度<len的情况下每次dis+1
        }
        //但是最后一组可能会start+dis>=len超出范围无法判断
        //所以这里单独判断最后一组
        if((len - start) % 2 == 0){
            reverse(rev.begin()+start,rev.end());
        }
        p = head;
        for(int i=0;i<len;++i){
            p->val = rev[i];
            p=p->next;
        }
        return head;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值