1 链表 1.6 K 个一组翻转链表 (LeetCode No.25)

https://blog.csdn.net/ganggang129/article/details/103987491

文章目录
1. 题目描述
2. 解题方法及代码
2.1 递归法
3. LeetCode练习代码仓库(gitee)
1. 题目描述
LeetCodeCN链接

该题是No.24的一般化版本

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例 :

给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明 :

你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

2. 解题方法及代码
2.1 递归法
把链表按一组k个节点分组,反转每组的节点,每组反转后的最后一个节点(也就是反转前的第一个节点)连接下一组反转后的第一个节点。reverseKGroup函数的参数是原链表的表头,返回值是反转后新链表的表头。

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        if  (head == null || head.next == null) return head;
        ListNode[] nodes = new ListNode[k];  // k个指针分别表示组内的每个元素
        if (largerThanK(head, k)) {
            for(int i = 0; i < k; i++) {
                nodes[i] = head;
                head = head.next; 
            } // 将接下来的k个元素加入到数组,顺便此时head也移动到了下一组的开头
            for (int i = 0; i < k - 1; i++) {
                nodes[i+1].next = nodes[i];
            } // 反转该组的k个节点
            nodes[0].next = reverseKGroup(head, k); // 反转后的最后一个节点(也就是反转前的第一个节点)连接下一组节点反转后的开头
            return nodes[k-1];
        } else return head; // 如果剩余不到k个,就原封不动返回
    }

    public boolean largerThanK(ListNode head, int k) { //判断剩余的节点个数是否大于等于k个
        if (k == 1 && head != null) return true;
        boolean flag = true;
        for (int i = 0; i < k - 1; i++) {
            head = head.next;
            if (head == null) {
                flag = false;
                break;
            }
        }
        return flag;
    }
}
 
3. LeetCode练习代码仓库(gitee)
我的LeetCode练习题
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值