题解 | #链表中的节点每k个一组翻转#

链表中的节点每k个一组翻转

http://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e

思路:给定一个链表,和一个小组的长度k,可以将一个小组分为(用切片表示:)[0:k][k:2k]...多余的不用进行翻转。这里可分为小组的数量即是链表切片与给定k的商,这里用nums表示。接下来只需要循环将上述分成的切片的切片进行“交换”,最后统一指定Next,(最后一个节点的Next置为nil)。

func reverseKGroup(head *ListNode, k int) *ListNode {
	// write code here
	if head == nil {
		return nil
	}
	var res []*ListNode
    //将结点都导入切片
	for head != nil {
		res = append(res, head)
		head = head.Next
	}
	l := len(res)
	nums := l / k
	for i := 0; i < nums; i++ {
		SwapRes(res[i*k : (i+1)*k])
	}
	node := outRes(res)
	return node
}
//循环指定每个节点的Next,最后一个置为nil
func outRes(res []*ListNode) *ListNode {
	for i := 0; i < len(res)-1; i++ {
		if res[i] != nil {
			res[i].Next = res[i+1]
		}
		res[len(res)-1].Next = nil
	}
	return res[0]
}
//给传进来的切片进行“交换”操作
func SwapRes(res []*ListNode) {
	var l int
	if len(res)%2 == 0 {
		l = len(res) >> 1
	} else {
		l = (len(res) - 1) >> 1
	}
	for i := 0; i < l; i++ {
		tmp := res[i]
		res[i] = res[len(res)-1-i]
		res[len(res)-1-i] = tmp
	}
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务