[路飞]_K 个一组翻转链表

341 阅读2分钟

题目介绍

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例1

image.png

输入: head = [1,2,3,4,5], k = 2
输出: [2,1,4,3,5]

示例2

image.png

输入: head = [1,2,3,4,5], k = 3
输出: [3,2,1,4,5]

示例3

输入: head = [1,2,3,4,5], k = 1
输出: [1,2,3,4,5]

示例4

输入: head = [1], k = 1
输出: [1]

提示:

解题思路

1.如果 k 的值为 1,说明不需要进行翻转,直接返回头节点即可
2.定义一个虚拟头节点,虚拟头节点的下一个节点指向头节点
3.定义 pre 指针指向虚拟头节点,定义 se 指针指向 head 节点,分别表示待反转链表开始和结束的位置
4.e 指针往前走 k - 1 步,到达链表结束的位置
5.如果 e 指向空节点,说明当前链表的节点个数不足以进行翻转,直接返回链表的头节点,结束整个过程
6.否则对 se 之间的链表进行翻转,并插入到翻转链表的上一个节点之后
7.pre 指向 s 所在的节点,se 指向 s 的下一个节点
8.重复 4-7 这个过程,直到待翻转链表的长度小于 k

3.gif

解题代码

var reverseKGroup = function(head, k) {
    if (k === 1) return head
    const newNode = new ListNode(-1, head)
    let pre = newNode, n = k, s = e = head
    while (s) {
        while (--n && e) {
            e = e.next
        }
        if (!e) return newNode.next
        pre.next = reverse(s, k)
        pre = s
        s = e = s.next
        n = k
    }
    return newNode.next
};

var reverse = function(head, k) {
    let cur = head, next = head.next
    while (--k) {
        head.next = next.next
        next.next = cur
        cur = next
        next = head.next
    }
    return cur
}

以上就是本题的解题思路,可以查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II