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

题目

给你一个链表,每 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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。