题解 | #链表中的节点每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
}
}