51 lines
770 B
Go
51 lines
770 B
Go
package q25
|
|
|
|
type ListNode struct {
|
|
Val int
|
|
Next *ListNode
|
|
}
|
|
|
|
func reverse(begin *ListNode, k int) (newHead, newTail *ListNode) {
|
|
tail := begin
|
|
for range k - 1 {
|
|
if tail.Next == nil {
|
|
return begin, tail // no enough nodes
|
|
}
|
|
tail = tail.Next
|
|
}
|
|
|
|
// Reverse
|
|
cur := begin
|
|
prev := tail.Next
|
|
for range k - 1 {
|
|
t := cur.Next
|
|
cur.Next = prev
|
|
prev, cur = cur, t
|
|
}
|
|
cur.Next = prev
|
|
return cur, begin
|
|
}
|
|
|
|
func reverseKGroup(head *ListNode, k int) *ListNode {
|
|
if k < 2 {
|
|
return head
|
|
}
|
|
|
|
var ret, prevTail *ListNode
|
|
p := head
|
|
for p != nil {
|
|
newHead, newTail := reverse(p, k)
|
|
if ret == nil {
|
|
ret = newHead
|
|
}
|
|
if prevTail != nil {
|
|
prevTail.Next = newHead
|
|
}
|
|
prevTail = newTail
|
|
p = newTail.Next
|
|
}
|
|
|
|
return ret
|
|
}
|
|
|
|
var _ = reverseKGroup
|