返回

K个一组反转链表:打造代码战场上的你

后端

求职季出征!春招打卡挑战赛来袭!

各位程序员精英,2022春招打卡挑战赛已向你发出盛情邀约!

在春意盎然的季节里,让我们一同开启解题大冒险,用代码撬动春招机会的大门。

今日难题:k个一组反转链表,让我们一起征战!

题目

给你一个链表,每k个节点一组进行反转,并返回反转后的链表。

k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的倍数,那么将最后剩余节点保持原有顺序。

思路分析:

本题是反转链表1和反转链表2题目的进阶版,细节处理会稍显麻烦。

实现步骤:

  1. 定义一个名为reverseKGroup的函数,接收两个参数:head(链表头节点)和k(反转间隔)。
  2. 使用两个指针prevcurr来遍历链表。
  3. 使用一个循环来将当前组的k个节点反转。
  4. 将反转后的组连接到前一组的末尾。
  5. 更新prevcurr指针,继续遍历链表。
  6. 返回反转后的链表。

代码实现(Go语言):

func reverseKGroup(head *ListNode, k int) *ListNode {
    if head == nil || k == 1 {
        return head
    }

    dummy := &ListNode{Val: 0, Next: head}
    prev := dummy

    for head != nil {
        curr := head
        for i := 0; i < k-1 && curr != nil; i++ {
            curr = curr.Next
        }

        if curr == nil {
            break
        }

        next := curr.Next
        curr.Next = nil
        reverseList(head)
        prev.Next = curr
        head.Next = next
        prev = head

        head = next
    }

    return dummy.Next
}

func reverseList(head *ListNode) {
    var prev *ListNode
    curr := head

    for curr != nil {
        next := curr.Next
        curr.Next = prev
        prev = curr
        curr = next
    }
}

代码解析:

  • 定义一个虚拟头节点dummy,并将其指向链表头节点head
  • 使用两个指针prevcurr来遍历链表。
  • 使用一个循环来将当前组的k个节点反转。
  • 将反转后的组连接到前一组的末尾。
  • 更新prevcurr指针,继续遍历链表。
  • 返回反转后的链表。

示例:

输入:head = [1,2,3,4,5,6,7,8,9,10], k = 3

输出:[3,2,1,6,5,4,9,8,7,10]

总结:

k个一组反转链表是LeetCode上的一道经典题目,涉及到链表的反转和分组操作。通过本题的讲解,希望你能更好地理解链表的结构和操作方法。祝你在春招打卡挑战赛中一路高歌,斩获offer!