Skip to content

Commit 422c15f

Browse files
aQuaaQua
aQua
authored and
aQua
committed
finish Problem 25
1 parent 4fec706 commit 422c15f

File tree

3 files changed

+66
-17
lines changed

3 files changed

+66
-17
lines changed

Algorithms/0025.reverse-nodes-in-k-group/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ For k = 2, you should return: 2->1->4->3->5
1717
For k = 3, you should return: 3->2->1->4->5
1818

1919
## 解题思路
20+
题目要求,把一条链上的每k个节点进行逆转,不足k个的末尾,则不需要逆转。
2021

22+
详见注释
2123

2224
## 总结
2325

Algorithms/0025.reverse-nodes-in-k-group/reverse-nodes-in-k-group.go

Lines changed: 43 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,63 @@ package Problem0025
77
* Next *ListNode
88
* }
99
*/
10+
1011
func reverseKGroup(head *ListNode, k int) *ListNode {
12+
if head == nil || head.Next == nil || k < 2 {
13+
return head
14+
}
15+
16+
next, ok := needReverse(head, k)
17+
if ok {
18+
head, tail := reverse(head)
19+
// 递归
20+
// 把整理好了的前k个节点的尾部,指向整理好了的后面节点的head
21+
tail.Next = reverseKGroup(next, k)
22+
return head
23+
}
1124

12-
return nil
25+
return head
1326
}
14-
func canReverse(head *ListNode, k int) (*ListNode, bool) {
27+
28+
// 判断是否有前k个节点需要逆转。
29+
// 需要的话
30+
// 会把KthNode.Next = nil,把k和k+1节点斩断,便于前k个节点的逆转。
31+
func needReverse(head *ListNode, k int) (begin *ListNode, ok bool) {
1532
for head != nil {
16-
k--
17-
if k == 0 {
18-
return head.Next, true
33+
if k == 1 {
34+
begin = head.Next
35+
// 把前k与后面的节点斩断, 便于reverse
36+
head.Next = nil
37+
return begin, true
1938
}
39+
40+
head = head.Next
41+
k--
2042
}
43+
2144
return nil, false
2245
}
2346

47+
// 返回逆转后的首尾节点
2448
func reverse(head *ListNode) (first, last *ListNode) {
2549
if head == nil || head.Next == nil {
2650
return head, nil
2751
}
28-
if head.Next.Next == nil {
29-
last = head
30-
first = head.Next
31-
first.Next = last
52+
53+
gotLast := false
54+
55+
for head != nil {
56+
temp := head.Next
57+
head.Next = first
58+
first = head
59+
head = temp
60+
61+
if !gotLast {
62+
last = first
63+
gotLast = true
64+
}
3265
}
33-
var temp *ListNode
34-
last = head
35-
first, temp = reverse(head.Next)
36-
temp.Next = last
37-
//last.Next = nil
66+
3867
return first, last
3968
}
4069

Algorithms/0025.reverse-nodes-in-k-group/reverse-nodes-in-k-group_test.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ func Test_Problem0025(t *testing.T) {
3838
ans{[]int{3, 2, 1, 4, 5}},
3939
},
4040

41+
question{
42+
para{
43+
[]int{1, 2, 3, 4, 5},
44+
1,
45+
},
46+
ans{[]int{1, 2, 3, 4, 5}},
47+
},
48+
4149
// 如需多个测试,可以复制上方元素。
4250
}
4351

@@ -48,10 +56,20 @@ func Test_Problem0025(t *testing.T) {
4856
ast.Equal(a.one, l2s(reverseKGroup(s2l(p.one), p.two)), "输入:%v", p)
4957
}
5058
}
51-
59+
func Test_needReverse(t *testing.T) {
60+
head := s2l([]int{1, 2, 3, 4, 5, 6})
61+
begin, ok := needReverse(head, 4)
62+
assert.True(t, ok, "长度足够的链却提示不能逆转")
63+
assert.Equal(t, []int{1, 2, 3, 4}, l2s(head), "前链不对, 没有被斩断")
64+
assert.Equal(t, []int{5, 6}, l2s(begin), "后链不对")
65+
}
5266
func Test_reverse(t *testing.T) {
53-
head, _ := reverse(s2l([]int{1, 2, 3}))
54-
assert.Equal(t, []int{3, 2, 1}, l2s(head), "无法逆转链")
67+
first, last := reverse(s2l([]int{1, 2, 3}))
68+
assert.Equal(t, []int{3, 2, 1}, l2s(first), "无法逆转链")
69+
assert.Equal(t, 1, last.Val, "链尾部的值不对")
70+
71+
Nil, _ := reverse(s2l([]int{}))
72+
assert.Nil(t, Nil, "无法逆转空链")
5573
}
5674

5775
// convert *ListNode to []int

0 commit comments

Comments
 (0)