将给出的链表中的节点每K 个一组翻转,返回翻转后的链表
如果链表中的节点数不是K 的倍数,将最后剩下的节点保持原样
你不能更改节点中的值,只能更改节点本身。
要求空间复杂度 O(1)
例如:
给定的链表是 1 2 3 4 5
对于 k=2, 你应该返回 21 43 5
对于 k=3, 你应该返回 321 45
思路:需要存储翻转部分之前的点,之后的点,翻转之后开始的点
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
func reverseKGroup( head *ListNode , k int ) *ListNode {
// write code here
newHead := new(ListNode)
newHead.Next = head
pre := newHead
for head != nil {
//确定有k个节点,并找到k个节点的下一个节点
next := head
for i := 0; i < k; i++ {
if next == nil {
return newHead.Next
}
next = next.Next
}
head = next
//旋转节点
node := pre.Next
for i := 0; i < k; i++ {
tmpNode := node.Next
node.Next = next
next = node
if i != k-1 {
node = tmpNode
}
}
tmpNode := pre.Next
pre.Next = node
pre = tmpNode
}
return newHead.Next
}