题目
给你一个链表的头节点 head
。
链表中的节点 按顺序 划分成若干 非空 组,这些非空组的长度构成一个自然数序列(1, 2, 3, 4, ...
)。一个组的 长度 就是组中分配到的节点数目。换句话说:
- 节点
1
分配给第一组 - 节点
2
和3
分配给第二组 - 节点
4
、5
和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;
}
};