一道链表反转题的个人解法(js)

为了方便理解,这里用一个数组作为例子,即[1,2,3,4,5,6,7,8,9,10,11];
要求:根据一个参数K,每K个数据进行一次反转,并且要求从尾部开始,即从11开始,每K个元素一组进行一次反转,如果个数不够K个,不进行反转,返回最终结果

那么首先能想到的就是递归,接下来就是确定函数要解决的问题步骤
1.从数组尾部开始,获取K个元素作为一组,如果个数够K个,命名为foot对象,剩下的部分保留不动,如果不够则返回参数
2.将foot对象中的元素反转
3.将保留部分作为递归函数的参数,并将反转后的foot对象加在后面

也许看到上面还是没法立刻动手写代码,那么先降低难度,不要求从尾部开始,而从头部开始,那步骤就是
1.从数组头部开始,获取K个元素作为一组,如果个数够K个,命名为head对象,剩下的部分保留不动,如果不够则返回参数
2.将head对象中的元素反转
3.将保留部分作为递归函数的参数,并将反转后的head对象加在前面

let a=[1,2,3,4,5,6,7,8,9,10,11];
function fn(obj){
  if(obj.length>2){
    let head=new Array(obj.slice(0,3).reverse());
    let temp=obj.slice(3);
    return head+","+fn(temp);
  }else{
    return obj;
  }
}
console.log(fn(a));//3,2,1,6,5,4,9,8,7,10,11

成功实现了从头部开始的反转,那么只要将获取head对象变为获取foot对象,就能达到从尾部开始反转的目的

function fn2(obj){
  if(obj.length>2){
    let foot=new Array(obj.slice(obj.length-3,obj.length).reverse());
    let temp=obj.slice(0,obj.length-3);
    return fn2(temp)+","+foot;
  }else{
    return obj;
  }
}
console.log(fn2(a));//1,2,5,4,3,8,7,6,11,10,9

本篇文章灵感来自于一篇java的面试算法题,与这个类似,有兴趣的可以搜搜看,实际解题思路与本人的不太一样

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值