反转偶数长度组的节点
给你一个链表的头节点 head 。
链表中的节点 按顺序 划分成若干 非空 组,这些非空组的长度构成一个自然数序列(1, 2, 3, 4, ...)。一个组的 长度 就是组中分配到的节点数目。换句话说:
节点 1 分配给第一组
节点 2 和 3 分配给第二组
节点 4、5 和 6 分配给第三组,以此类推
注意,最后一组的长度可能小于或者等于 1 + 倒数第二组的长度 。
反转 每个 偶数 长度组中的节点,并返回修改后链表的头节点 head
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-nodes-in-even-length-groups
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
详细注解代码 ,直接在原链表进行一步步修改
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseEvenLengthGroups(ListNode head) {
int cnt = 0;//在每一组中,如果到达本组长度,判断是否反转
int base = 1;// 记录每一组中的个数,第一组 1 个
ListNode temp = head; // 通过辅助指针 改变源节点的值
ListNode pre = null; // 到新的组,上一组的尾节点
ListNode start = null; //偶数组会用到的 反转开始部位
ListNode next = null; //把反转的尾部的下一个节点存起来
while(temp!=null){
cnt++; //计算每一组的元素数量
if(cnt==base){ // 一个组遍历结束
if(base%2==0){ //偶数个数组 进行反转
next=temp.next; // 记录以后的部分
temp.next=null; //把节点断开 指向 null
start=pre.next; // 需要反转的
pre.next=reverse(start); //反转链表
start.next=next; // 需要给 start指定下一个节点
temp=start; // 保证 temp 的下一个节点是 next
}
pre=temp; //没反转,则记录遍历的组末尾
base++; // 下一组
cnt=0; // 归零
}
temp=temp.next; //从前往后移动
}
if(cnt%2==0){ //剩下的如果是偶数个就反转
pre.next=reverse(pre.next);
}
return head; // 都是在 head基础上改变的
}
// 基本反转链表
ListNode reverse(ListNode node){
ListNode pre=null;
ListNode next=null;
while(node!=null){
next=node.next;
node.next=pre;
pre=node;
node=next;
}
return pre;
}
}