【数据结构和算法实践-LeetCode-K个一组翻转链表】

这里写自定义目录标题

K个一组翻转链表

先背代码吧,周末再来优化,leetCode中的题目

/**
 * @author: Maoc
 * @date: 2024/8/28 23:04
 * @description:K个一组链表翻转 总体逻辑:
 * 一、找到k区间:若k区间小于k个数,则返回当前node
 * 1.1、找出k范围最大的那个元素,如:0~k-1;k~2k-1
 * 1.2、若k区间小于个数,则返回当前node的head
 * 1.3、参数设置,开始startNode、endNode;注意,为了循环连贯性,endNode取k区间的下一个
 * 二、实现k区间翻转
 * 2.1、找出k范围最大的那个元素,如:0~k-1;k~2k-1
 * 三、各区间的连贯
 * 3.1、head指向第一个连贯k区间的endNode
 * 3.2、设置一个lastNode记录上一个的结尾(即startNode),指向下一个区间的开头
 **/
public class LeetCode95ReverserNodeInKGroup {

    public static class ListNode {
        public int val;
        public ListNode next;
    }

    public static ListNode reverseKGrooup(ListNode head, int k) {

        ListNode start = head;
        ListNode end = getKNode(start, k);
        if (start == null) {
            return head;
        }
        head = end;
        reverse(start, end);
        ListNode lastNode = start;
        while (lastNode.next != null) {
            start = lastNode.next;
            end = getKNode(start, k);
            if (end == null) {
                return head;
            }
            reverse(start, end);
            lastNode.next = end;
            lastNode = start;
        }
        return head;
    }


    private static ListNode getKNode(ListNode start, int k) {
        while (--k != 0 && start != null) {
            start = start.next;
        }
        return start;
    }

    private static void reverse(ListNode start, ListNode end) {
        end = end.next;
        ListNode pre = null;
        ListNode current = start;
        ListNode next = null;
        while (current != end) {
            next = current.next;
            current.next = pre;
            pre = current;
            current = next;
        }
        start.next = end;
    }


}

反思&总结

持续更新的第五天,效果真的一般,进入比较难的区域了,又要综合上班和平时时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值