以 k 个节点翻转链表,js篇

本文深入探讨了链表操作的高级技巧,特别是如何每K个节点进行一次反转,不足K则保持原有顺序。通过具体的例子,如1->2->3->4->5,展示了不同K值下的反转效果,提供了JavaScript实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

反转链表,每 k 个节点反转一次,不足 k 就保持原有顺序

公司:bilibili->改编
概括:
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
题:

// 原始数据
let listNodes = [{n:1,next:2},{n:2,next:3},{n:3,next:4},{n:4,next:5},{n:5,next:6},{n:6,next:7},{n:7,next:8},{n:8,next:9},{n:9,next:10},{n:10,next:11},{n:11,next:null}]
//结果数据
let reversNode = [{n:3,next:2},{n:2,next:1},{n:1,next:6},{n:6,next:5},{n:5,next:4},{n:4,next:9},{n:9,next:8},{n:8,next:7},{n:7,next:10},{n:10,next:11},{n:11,next:null}]

答案

个人思路解答,如不合理请指出

  let listNodes = [
  {n:1,next:2},
  {n:2,next:3},
  {n:3,next:4},
  {n:4,next:5},
  {n:5,next:6},
  {n:6,next:7},
  {n:7,next:8},
  {n:8,next:9},
  {n:9,next:10},
  {n:10,next:11},
  {n:11,next:null}
  ]
  function reverseKGroup(listNode,k){
    if (k<1 || k > listNode){
      return listNode
    }
    let resultList = []
    let otherN = listNode.length%k
    let times = (listNode.length - otherN)/k
    for (let i = 0; i < times; i++) {
      let subList = []
      // 分组 k倒序遍历
      for (let j = k-1; j >= 0; j--) {
        let node = listNode[i*k+j]
        // 将翻转后的链表指向正确的位置 最后一个位置为空,下次循环往复赋值
        if (j+1===k) {
          node.next = null
        } else if(subList.length > 0){
          subList[subList.length - 1].next = node.n
        }
        subList.push(node)
      }
      // 分组中,让上一个分组的最后一个链指向当前分组的第一个链表
      if (resultList.length > 0) {
        resultList[resultList.length - 1].next = subList[0].n
      }
      resultList.push(...subList)
    }
    // 把不满k的剩余链表拼接上
    if (otherN > 0){
      let otherList = listNode.slice(-otherN,listNode.length)
      resultList[resultList.length - 1].next = otherList[0].n
      resultList = resultList.concat(otherList)
    }
    return resultList
  }
  let reversNode = reverseKGroup(listNodes,3)
  console.log(reversNode)


我们来看一个 LeetCode 题目:206. 反转链表
因为我觉得里面用js解答并不是很容易理解,所以我自己想了一个解法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值