leetcode-25-K个一组翻转链表

110 阅读1分钟

image.png leetcode原题

解题思路

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

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
}