每日一题算法:K个一组翻转链表reverseKGroup2020.5.16

2020.5.16 K个一组翻转链表reverseKGroup

在这里插入图片描述

提供的格式

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {

    }
}

思路分析

感觉很简单啊,遍历一遍不就可以了吗?画一个思路图吧

在这里插入图片描述

我们把第2-k的下一个改成上一个,然后把第1个的下一个改成第k个的下一个,同时加上一些长度的验证就应该能够实现。

试试,试的时候发现了很多的问题,一再地调试修改,问题越来越多,需要验证的元素越来越多,最后好不容易修改好了放在leecode上却跑不了,崩溃了,虽然这个算法很笨。

class Solution {
     
    public ListNode reverseKGroup(ListNode head, int k) {
        ListNode[] nodes=null;
        ListNode resultNode=null;
        while (true){
            nodes=new ListNode[k];

            for (int i=0;i<k;i++){
                if(i==0)
                    nodes[i]=head;
                else{
                    if (nodes[i-1]!=null)
                    nodes[i]=nodes[i-1].next;
                }
            }

            if (nodes[k-1]==null)
                break;

            //这个循环是用来给   长度%k=0时,最后一次的倒置时,第一个节点的下一个应该为空
            if (nodes[k-1].next==null){
                for(int i=1;i<k;i++)
                {
                        nodes[i].next=nodes[i-1];
                }
                nodes[0].next=null;
            }
            else {
                //默认下一次不用倒置,直接指向下一个链表开头
                nodes[0].next=nodes[k-1].next;
                //需要判断下一次需不需要倒置,如果需要那么指向最后一个,如果不需要,那就指向第一个

                ListNode node2=nodes[k-1].next;

                //先看看下一次能否到达尾部
                for (int j=0;j<k-1;j++)
                {
                    try{
                        node2=node2.next;
                    }catch (Exception e){
                        break;
                    }
                }
                //如果之前出错,那么node2肯定为空,node2如果不为空则证明下一个链的长度为k,然后判断node2的下一个是否为空
                head=nodes[0].next;
                
                if (node2!=null)
                    nodes[0].next=node2;
                //链表的倒置工作,之前判断过这次是否要倒置了,所以肯定需要倒置,直接倒置就可以了,从第2个开始
                for(int i=1;i<k;i++)
                {
                        nodes[i].next=nodes[i-1];
                }
            }
            if(resultNode==null){
                resultNode=nodes[k-1];
            }
            if(nodes[0].next==null)
                break;
        }

        if (resultNode==null)
            return head;
        else
            return resultNode;
    }
}

明天去查一查更简单的算法吧,今天就稍微休息一下。

想想不爽,回来检查了一下,是类名的原因导致的编译出错,把类名修改为默认的就可以了

然后修改了部分的代码终于通过了

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值