LeetCode 25. K 个一组翻转链表

这题难度是hard,但解法并没什么复杂度,主要是边界判定,所以直接上代码了

func reverseKGroup(head *ListNode, k int) *ListNode {
	if k == 1 || head == nil {
		return head
	}
	var n int
	head = &ListNode{Next: head}
	pre := head
	for node := head.Next; node != nil;  {
		n++
		// 每次需要翻转的一组
		if n == k {
			// p.N -> 1,2,|| 3,4,|| 5  k = 2
			tmp := pre.Next // tmp = 1,翻转后 1.Next = 3
			pre.Next = reverse(pre.Next, node) // p.Next = 2
			pre = tmp // pre = 1
			node = tmp.Next // node = 1.Next = 3
			n = 0
			continue
		}
		node = node.Next
	}
	return head.Next
}

func reverse(h,t *ListNode) *ListNode {
	var pre *ListNode
	// 1,2,3,4, 需要换成3,2,1,4,则tail=4
	tail := t.Next // 这里是4
	// 这里不能靠nil判断,因为只是链表的一段,所以拿tail=4判断
	for node := h; node != tail; {
		tmp := node.Next
		node.Next = pre
		pre = node
		node = tmp
	}
	// 这里需要注意的是,外面还是要继续遍历链表的,不能把4弄丢了,故把 1.Next = 4
	h.Next = tail
	return pre
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值