题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

/*
 * function ListNode(x){
 *   this.val = x;
 *   this.next = null;
 * }
 */

/**
 *
 * @param head ListNode类
 * @param k int整型
 * @return ListNode类
 */

// 思路:发现大量重复类似的代码,所以递归调用
function reverseKGroup(head, k) {
  if (k == 1 || head == null) {
    return head;
  }
//  变量说明,pre、cur,逆序操作的双指针,newHead、newEnd,逆序操作之后的新的链头,链尾
  let newHead = null;
  let newEnd = null; 
  let pre = null;
  let cur = head;
//     判断当前一组是否长度小于k,如果是就返回head,这里的head实际上是递归传入的head,除了第一组之外,其实都是newHead
  let tmpCur = cur;
  for (let i = 0; i < k; i++) {
    if (tmpCur == null) {
      return head
    }
    tmpCur = tmpCur.next;
  }
  for (let i = 0; i < k; i++) {
    if (i == 0) {
      newEnd = cur;
// 这里保存一这一组的开头,执行完下面的逆序之后这里就变成了链尾,需要设定他的next为下一组的newHead
    }
//  逆序操作的代码
    let nextNode = cur.next;
    cur.next = pre;
    pre = cur;
    cur = nextNode;
  }
//  找到逆序之后的链头
  newHead = pre;
  if (cur != null) {
//   此时的cur进入了下一组的链头(未逆序操作的),判断是否递归,此时递归的head是当前的cur。这个递归返回的是那一段的新链头,需要将本段的链尾指向下一段的链头(将一段段的子链表,连接起来)
    newEnd.next = reverseKGroup(cur, k);
  }
//  返回新的链头
  return newHead;
}

module.exports = {
  reverseKGroup: reverseKGroup,
};

全部评论

相关推荐

小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
04-25 10:45
东南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务