首页 > 其他分享 >leetcode K个一组翻转链表

leetcode K个一组翻转链表

时间:2024-12-15 12:01:02浏览次数:7  
标签:ListNode leetcode 链表 start end next 节点 翻转

1、题目链接

25. K 个一组翻转链表 - 力扣(LeetCode)

2、题目描述

3、题目分析

a.每次根据输入的开始节点,得出k个节点之后的结束节点,即分组,然后返回该结束节点。注意有可能不够k个节点,就会返回null。

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

b.将分好组的start和end之间的节点翻转,需要提前记录下end的下一个节点(作为下一组的开始节点,循环往复),当前组翻转之后的尾节点需要抓住下一个开始节点。

public void reverse(ListNode start,ListNode end){
    ListNode nextStart=end.next;
    //新建一个cur变量,保证start的指向不变,后面需要用到start指向的节点。
    ListNode cur=start;
    ListNode pre=null;
    //翻转到下一个开始节点就结束
    while(cur!=nextStart){
        //单链表翻转的逻辑
        ListNode next=cur.next;
        cur.next=pre;
        pre=cur;
        cur=next;
    }
    //这句很关键,当前组的尾节点(翻转之后start变成了尾节点)
    //的next指针指向了下一句的开始节点,否则下一组的开始节点就找不到了
    start.next=nextStart;
}
    

c.最后在主函数里组合上述两个步骤,主函数要返回修改后的头节点,修改后的头节点一定是第一组翻转之后的结束节点,所以第一组要在循环外单独处理,为了返回处理之后的头节点。需要特别注意的是,b步骤之后上一组的结束节点指向了下一组的开始节点,但是等下一组翻转之后(开始节点就会变成结束节点,所以上一组的next指针的指向要更改)。

public ListNode reverseKGroup(ListNode head, int k) {
    if(head==null){
        return null;
    }
    ListNode start=head;
    ListNode end=getKGroupEnd(start,k);
    //说明第一组就不够k个节点
    if(end==null){
        //不够k个,不用翻转,返回当前头节点
        return head;
    }
    //够k个,则头节点为当前的end节点
    head=end;
    //翻转第一组
    reverse(start,end);
    //
    ListNode preEnd=start;
    while(preEnd.next!=null){
        //说明之后还有元素
        start=preEnd.next;
        end=getKGroupEnd(start,k);
        if(end==null){
        //不够k个,不用翻转,返回当前头节点
            return head;
        }
        reverse(start,end);
        preEnd.next=end;
        preEnd=start;
    }   
    return head;
}


4、运行结果 

标签:ListNode,leetcode,链表,start,end,next,节点,翻转
From: https://blog.csdn.net/weixin_56812051/article/details/144417073

相关文章

  • LeetCode //C - 496. Next Greater Element I
    496.NextGreaterElementIThenextgreaterelementofsomeelementxinanarrayisthefirstgreaterelementthatistotherightofxinthesamearray.Youaregiventwodistinct0-indexedintegerarraysnums1andnums2,wherenums1isasubsetof......
  • 【力扣算法】234.回文链表
    快慢指针:一个指针走两步,一个指针走一步,当快指针走到链表末尾时,慢指针走到中间位置。 逆转链表:根据指针位置分成两个表,逆转第二个表。按序判断就可以,如果是相同就是回文,反之就不是。快慢指针能找链表中间,也可以判断链表是否有环/***Definitionforsingly-linkedlist.......
  • 代码随想录day18 | leetcode 530.二叉搜索树的最小绝对差 501.二叉搜索树中的众数 236
    刷题收获所有递归的写法都与正常人类想法的实现顺序相反,都是先写条件成立会发生什么再写递归成立条件通过递归调用栈实现回到上一个节点节点(恢复上一层的状态),调用栈能够记录每次递归调用的函数状态,包括函数的局部变量、参数以及函数执行到的具体位置。当递归到某个节点......
  • leetcode 866. 回文质数
    866.回文质数想着开大数组,用质数筛选的方法。但是开大数组超内存了......
  • leetcode 2931. 购买物品的最大开销
    classSolution{public:  longlongmaxSpending(vector<vector<int>>&values)  {    intidx[500]={0};    for(inti=0;i<values.size();i++)    {      idx[i]=values[0].size()-1;    }  ......
  • 【LeetCode: 402. 移掉 K 位数字 + 单调栈】
    ......
  • 代码随想录算法训练营第四十六天|LeetCode647.回文串、LeetCode516.最长回文子序列
    前言打卡代码随想录算法训练营第49期第四十六天 ε(*′・∀・`)з゙首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode647......
  • 代码随想录算法训练营第四十五天|LeetCode115.不同的子序列、LeetCode583.两个字符串
    前言打卡代码随想录算法训练营第49期第四十五天ε(*′・∀・`)з゙首先十分推荐学算法的同学可以先了解一下代码随想录,可以在B站卡哥B站账号、代码随想录官方网站代码随想录了解,卡哥清晰易懂的算法教学让我直接果断关注,也十分有缘和第49期的训练营大家庭一起进步。LeetCode115不......
  • Swift 实现:寻找单链表相交节点
    文章目录摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结摘要本篇文章将分享如何通过Swift编写程序,找到两个单链表相交的起始节点。我们将分析问题,提供清晰的题解代码,并通过示例测试验证结果。同时,文章会详细剖析代码逻辑,评估其时间复杂度......
  • leetCode 2591将钱分给最多的儿童
    题目:给你一个整数 money ,表示你总共有的钱数(单位为美元)和另一个整数 children ,表示你要将钱分配给多少个儿童。你需要按照如下规则分配:所有的钱都必须被分配。每个儿童至少获得 1 美元。没有人获得 4 美元。请你按照上述规则分配金钱,并返回 最多 有多少个儿童获......