美文网首页
leetCode-25 《K 个一组翻转链表》

leetCode-25 《K 个一组翻转链表》

作者: TouchMe丶 | 来源:发表于2020-12-10 16:00 被阅读0次

    题目

    给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
    k 是一个正整数,它的值小于或等于链表的长度。
    如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序

    示例

    给你这个链表:1->2->3->4->5
    当 k = 2 时,应当返回: 2->1->4->3->5
    当 k = 3 时,应当返回: 3->2->1->4->5

    说明

    1. 你的算法只能使用常数的额外空间。
    2. 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

    解析

    思路:

    思路

    理解:

    1. 链表氛围已翻转部分,待翻转部分和未翻转部分。
      2.每次要选取出相应部分进行相应处理。

    代码

    单链表翻转

    // 单链表翻转 #leetCode 206
    const reverse = (head) => {
      let pre = null
      let cur = head
      while (cur !== null){
        let next = cur.next
        cur.next = pre
        pre = cur
        cur = next
      }
      return pre
    }
    

    K个一组翻转

    const reverseKGroup = (head, k) => {
      let dummy = new ListNode(null)
      dummy.next = head
      // 初始化prev 和 end
      let prev = dummy
      let end = dummy
    
      while (end.next !== null){
        for (let i = 0; i < k && end != null; i++) {
          end = end.next // 找到end的位置
        }
        if (end === null) break
        let start = prev.next // 找到当前需要的start位置
        let next = end.next // 暂存 end后面的
        end.next = null // 断开end和后面的链表
        let reversedList = reverse(start)
        prev.next = reversedList
        start.next = next
        prev = start
        end = prev
      }
      return dummy.next
    }
    

    相关文章

      网友评论

          本文标题:leetCode-25 《K 个一组翻转链表》

          本文链接:https://www.haomeiwen.com/subject/ybkubktx.html