返回
K个一组反转链表:打造代码战场上的你
后端
2024-02-03 19:27:42
求职季出征!春招打卡挑战赛来袭!
各位程序员精英,2022春招打卡挑战赛已向你发出盛情邀约!
在春意盎然的季节里,让我们一同开启解题大冒险,用代码撬动春招机会的大门。
今日难题:k个一组反转链表,让我们一起征战!
题目
给你一个链表,每k个节点一组进行反转,并返回反转后的链表。
k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的倍数,那么将最后剩余节点保持原有顺序。
思路分析:
本题是反转链表1和反转链表2题目的进阶版,细节处理会稍显麻烦。
实现步骤:
- 定义一个名为
reverseKGroup
的函数,接收两个参数:head
(链表头节点)和k
(反转间隔)。 - 使用两个指针
prev
和curr
来遍历链表。 - 使用一个循环来将当前组的
k
个节点反转。 - 将反转后的组连接到前一组的末尾。
- 更新
prev
和curr
指针,继续遍历链表。 - 返回反转后的链表。
代码实现(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
。 - 使用两个指针
prev
和curr
来遍历链表。 - 使用一个循环来将当前组的
k
个节点反转。 - 将反转后的组连接到前一组的末尾。
- 更新
prev
和curr
指针,继续遍历链表。 - 返回反转后的链表。
示例:
输入: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!