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,就会变成现在的尾结点。
痕迹
没有过去,就没法认定现在的自己