25. K 个一组翻转链表

124 阅读1分钟

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

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

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseKGroup(head *ListNode, k int) *ListNode {
    dummy := &ListNode{Next:head}
    p := head
    pre := dummy
    for p != nil {
        tail := p
        for i := 0; i < k - 1; i ++ {
            tail = tail.Next
            if tail == nil {
                return dummy.Next
            }
        }
        // nex := tail.Next
        head, tail := reverse(p, tail)
        pre.Next = head
        pre = tail
        p = tail.Next
    }
    return dummy.Next
}

func reverse(head, tail *ListNode) (*ListNode, *ListNode) {
    pre := tail.Next
    p := head
    for pre != tail {
        nex := p.Next
        p.Next = pre
        pre = p
        p = nex
    }
    return tail, head
}