u
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package top100liked
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// https://leetcode.cn/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&envId=top-100-liked
|
||||
|
||||
type ListNode struct {
|
||||
Val int
|
||||
Next *ListNode
|
||||
}
|
||||
|
||||
// 提交记录 3
|
||||
// 你就说快不快吧
|
||||
// func reverseKGroup(head *ListNode, k int) *ListNode {
|
||||
// if k == 1 {
|
||||
// return head
|
||||
// }
|
||||
// nodes := []*ListNode{}
|
||||
// p := head
|
||||
// nodes = append(nodes, &ListNode{0, head})
|
||||
// for p != nil {
|
||||
// nodes = append(nodes, p)
|
||||
// p = p.Next
|
||||
// }
|
||||
// tmp := nodes[0]
|
||||
// for i := range (len(nodes) - 1) / k {
|
||||
// tmp.Next = nodes[(i+1)*k]
|
||||
// nodes[i*k+1].Next = nodes[(i+1)*k].Next
|
||||
// for j := range k - 1 {
|
||||
// nodes[(i+1)*k-j].Next = nodes[(i+1)*k-j-1]
|
||||
// }
|
||||
// tmp = nodes[i*k+1]
|
||||
// }
|
||||
// return nodes[0].Next
|
||||
// }
|
||||
|
||||
func reverseKGroup(head *ListNode, k int) *ListNode {
|
||||
dummy := &ListNode{Next: head}
|
||||
prev := dummy
|
||||
for {
|
||||
// 检查剩余节点是否够 k 个
|
||||
tail := prev
|
||||
for range k {
|
||||
tail = tail.Next
|
||||
if tail == nil {
|
||||
return dummy.Next
|
||||
}
|
||||
}
|
||||
next := tail.Next // 下一组的起点
|
||||
// 翻转 [prev, tail] 这 k 个节点
|
||||
p := prev.Next
|
||||
var reversedHead, reversedTail *ListNode
|
||||
reversedTail = p // 翻转后 p 变成尾部
|
||||
var pre *ListNode
|
||||
for range k {
|
||||
tmp := p.Next
|
||||
p.Next = pre
|
||||
pre = p
|
||||
p = tmp
|
||||
}
|
||||
reversedHead = pre
|
||||
// 接回原链表
|
||||
prev.Next = reversedHead
|
||||
reversedTail.Next = next
|
||||
prev = reversedTail
|
||||
}
|
||||
}
|
||||
|
||||
func Test1(t *testing.T) {
|
||||
input := &ListNode{
|
||||
Val: 1,
|
||||
Next: &ListNode{
|
||||
Val: 2,
|
||||
Next: &ListNode{
|
||||
Val: 3,
|
||||
Next: &ListNode{
|
||||
Val: 4,
|
||||
Next: &ListNode{
|
||||
Val: 5,
|
||||
Next: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
output := reverseKGroup(input, 2)
|
||||
for output != nil {
|
||||
fmt.Print(output.Val, " ")
|
||||
output = output.Next
|
||||
}
|
||||
}
|
||||
|
||||
func Test2(t *testing.T) {
|
||||
input := &ListNode{
|
||||
Val: 1,
|
||||
Next: &ListNode{
|
||||
Val: 2,
|
||||
Next: &ListNode{
|
||||
Val: 3,
|
||||
Next: &ListNode{
|
||||
Val: 4,
|
||||
Next: &ListNode{
|
||||
Val: 5,
|
||||
Next: nil,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
output := reverseKGroup(input, 3)
|
||||
for output != nil {
|
||||
fmt.Print(output.Val, " ")
|
||||
output = output.Next
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
|
||||
func Test3(t *testing.T) {
|
||||
input := &ListNode{
|
||||
Val: 1,
|
||||
Next: &ListNode{
|
||||
Val: 2,
|
||||
Next: nil,
|
||||
},
|
||||
}
|
||||
output := reverseKGroup(input, 2)
|
||||
for output != nil {
|
||||
fmt.Print(output.Val, " ")
|
||||
output = output.Next
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
||||
Reference in New Issue
Block a user