编程导航算法通关村第二关|白银挑战—K个一组反转

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

核心思路还是使用头插法即可

    /*
    核心思路: 头插法
     确定要反转多少组,在根据要移动节点的次数(k - 1)移到头部进行改变 利用头插法即可
     */
    public ListNode reverseKGroup(ListNode head, int k) {
        //虚拟节点方便操作
        ListNode dummyNode = new ListNode();
        dummyNode.next = head;
        ListNode cur = head;
        //计算链表的长度,根据k可得要反转多少组
        int len = 0;
        while (cur != null) {
            cur = cur.next;
            len++;
        }
        int n = len / k;

        ListNode pre = dummyNode;
        cur = head;
        for (int i = 0; i < n; i++) {
            //使用头插法
            for (int j = 0; j < k - 1; j++) {
                //记录下一个节点,跟随cur进行改变
                ListNode next = cur.next;
                cur.next = cur.next.next;
                next.next = pre.next;
                pre.next = next;
            }
            pre = cur;
            cur = cur.next;
        }
        return dummyNode.next;
    }

你可能感兴趣的:(算法,java,开发语言)