K个一组反转列表


原题: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循环可以按照下面这种方式来进行理解

参考:如何k个一组反转链表 - labuladong的算法小抄 (gitbook.io)


文章作者: 小游
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小游 !
  目录