025-k个一组翻转链表

Description

给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。

说明 : 你的算法只能使用常数的额外空间。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

Example
给定这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5
Solution
type ListNode struct {
    Val int
    Next *ListNode
}

func reverseKGroup(head *ListNode, k int) *ListNode {
    if k <= 0 {
        return head
    }
    pre,end,next := reverseNode(head,k)
    for next != nil {
        end.Next,end,next = reverseNode(next,k)
    }
    return pre
}

func lenNode(head *ListNode)int  {
    count := 0
    node := head
    for node!= nil{
        count++
        node = node.Next
    }
    return count
}


func reverseNode(head *ListNode,k int)(pre*ListNode,end *ListNode,next *ListNode)  {
    if lenNode(head) < k {
        return head,nil,nil
    }
    i := 0
    //翻转,头变尾巴
    end = head
    for head != nil && i < k {
        next = head.Next
        head.Next = pre
        pre = head
        head = next
        i ++
    }
    end.Next = next
    return
}

leetCode地址