原题:25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)
实际代码:
// 反转两个链表
func reverse(a *ListNode,b *ListNode) *ListNode {
var pre,cur,nex *ListNode
pre = nil
cur = a
nex = a
for cur!=b{
// 保存下一个节点
nex = cur.Next
// 下一个节点为前一个节点(因为我们是三个节点之间进行反转)
cur.Next = pre
// 下移一个节点
pre = cur
cur = nex
}
return pre
}
// 反转一组一组的元素
func reverseKGroup(head *ListNode,k int) * ListNode{
// base判断,当头节点为空就跳出结束函数
if head == nil{
return nil
}
// 定义[a,b)这两个区间
var a,b *ListNode
a,b=head,head
for i:=0;i<k;i++{
// 当我们还没循环k次这个节点就变成空的话我们直接跳出,不需要反转,这里我们返回头节点就行
if b == nil{
return head
}
b=b.Next
}
// 这里我们开始反转
newNode:=reverse(a,b)
// 同时我们要把头节点和后面的节点连接起来(这里之所以是b是因为我们是反转了a-b这两个范围)
a.Next = reverseKGroup(b,k)
// 返回反转后的头节点
return newNode
}
这里实际上使用了迭代和递归这两个想法来实现,那个for循环可以按照下面这种方式来进行理解