Lever's Castle

25. K 个一组翻转链表

March 24, 2020

https://leetcode-cn.com/problems/reverse-nodes-in-k-group/

解:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseKGroup(head *ListNode, k int) *ListNode {
    if head == nil || head.Next == nil || k <= 1 {
        return head
    }

    var prev *ListNode
    current := head
    for i:=0;i<k;i++ {
        prev = current
        if current == nil {
            return head
        }
        current = current.Next
    }
    prev.Next = nil
    res := reverseListNode(head)
    head.Next = reverseKGroup(current, k)

    return res
}

func reverseListNode (head *ListNode) (res *ListNode) {
    var prev *ListNode
    for head != nil {
        next := head.Next
        if res == nil {
            res = head
            prev = head
        } else {
            temp := res
            prev.Next = head.Next
            res = head
            res.Next = temp
        }
        head = next
    }

    return
}

假设这个链表长度与 k 一致,则该函数的实际行为是把这个链表反转。这样我们就把这个问题分解成如何反转列表,于是就有了上面的 reverseListNode 函数。只要遍历链表,不断的将后面的节点放到头部即可。

处理完链表反转,我们接下来需要把链表按 k 个节点进行截断,分别进行反转,最后将反转的结果连在一起即可。这里不太好绕过来的是引用的处理,在一次 reverse 之后,原来的 head,就会变成现在的尾结点。


Lever

痕迹
没有过去,就没法认定现在的自己