2021-11-14 267周赛 反转链表升华版

反转偶数长度组的节点

给你一个链表的头节点 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;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值