leecode25 K个一组翻转链表

在这里插入图片描述

我的思路

这个题目是((20250817112352-w8vn3te ‘0092 反转链表II’)) 的延申题目,虽然难度上是困难,但实际上并不是很难。
本质上我们还可以用第92题的方法来解决这个题目。

我的思路主要分为三步

  1. 确定每一组的前一个和后一个元素

    for(int i =0;i<=k;i++){
        if(last==null){
            flag = true;
            break; //不够k个。
        }
        last = last.next;
    }
    不够k个则保持原有顺序,结束循环
    if(flag) break;
    
  2. 翻转链表部分
    这里相比92题也做了一部分的修改,我多加入了一个变量,用于记录这k个元素的最开始的元素,当翻转结束之后,这个元素成为这k个元素的最后一个元素,同时也是下一组的前一个pre元素。

    ListNode pre = last;
    ListNode cur = p0.next;
    ListNode temp = p0.next;
    while(cur!=last){
        ListNode nxt = cur.next;
        cur.next = pre; // 每次循环只修改一个 next,方便大家理解
        pre = cur;
        cur = nxt;
    }
    p0.next = pre;
    
  3. 更新下一组的pre和last

    //更新下一轮的p0和last;
    p0 = temp;
    last = temp;
    

总代码为:

public ListNode reverseKGroup(ListNode head, int k) {
    ListNode dummy = new ListNode(0,head);
    ListNode p0 = dummy;
    ListNode last  = dummy;
    boolean flag = false;
    //从第一组开始遍历,然后主键的找k次,进行遍历而已
    while(true){
        //确定每一轮的前一个和后一个元素
        for(int i =0;i<=k;i++){
            if(last==null){
                flag = true;
                break; //不够k个。
            }
            last = last.next;
        }

        //不够k个保持原有顺序
        if(flag) break;

        //翻转链表
        ListNode pre = last;
        ListNode cur = p0.next;
        ListNode temp = p0.next;
        while(cur!=last){
            ListNode nxt = cur.next;
            cur.next = pre; // 每次循环只修改一个 next,方便大家理解
            pre = cur;
            cur = nxt;
        }
        p0.next = pre;

        //更新下一轮的p0和last;
        p0 = temp;
        last = temp;
    }
    return dummy.next;
}

灵神的思路

灵神的话,首先统计了这个节点的个数,然后利用这个节点的个数进行遍历循环。和我的主要区别在于,他并没有找这个last节点。本质上我和灵神的思路差不多,毕竟就是跟着他学的。

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 统计节点个数
        int n = 0;
        for (ListNode cur = head; cur != null; cur = cur.next) {
            n++;
        }

        ListNode dummy = new ListNode(0, head);
        ListNode p0 = dummy;
        ListNode pre = null;
        ListNode cur = head;

        // k 个一组处理
        for (; n >= k; n -= k) {
            for (int i = 0; i < k; i++) { // 同 92 题
                ListNode nxt = cur.next;
                cur.next = pre; // 每次循环只修改一个 next,方便大家理解
                pre = cur;
                cur = nxt;
            }

            // 见视频
            ListNode nxt = p0.next;
            p0.next.next = cur;
            p0.next = pre;
            p0 = nxt;
        }
        return dummy.next;
    }
}

作者:灵茶山艾府
链接:https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/1992228/you-xie-cuo-liao-yi-ge-shi-pin-jiang-tou-plfs/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值