-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy path024_test.go
99 lines (90 loc) · 1.56 KB
/
024_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
//
// 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
//
//
//
// 示例 1:
//
//
//输入:head = [1,2,3,4]
//输出:[2,1,4,3]
//
//
// 示例 2:
//
//
//输入:head = []
//输出:[]
//
//
// 示例 3:
//
//
//输入:head = [1]
//输出:[1]
//
//
//
//
// 提示:
//
//
// 链表中节点的数目在范围 [0, 100] 内
// 0 <= Node.val <= 100
//
//
//
//
// 进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)
// Related Topics 递归 链表
// 👍 917 👎 0
package leetcode
func swapPairs(head *ListNode) *ListNode {
if head == nil {
return nil
}
var (
remain = head
first, second, pre *ListNode
dummy = new(ListNode)
)
for {
if remain == nil {
break
}
remain, first, second = pickNodes(remain)
if second == nil {
if pre == nil {
pre = first
dummy.Next = pre
} else {
pre.Next = first
}
break
}
nf, ns := swapPair(first, second)
if pre == nil {
pre = ns
dummy.Next = nf
} else {
pre.Next = nf
pre = ns
}
}
return dummy.Next
}
func pickNodes(head *ListNode) (*ListNode, *ListNode, *ListNode) {
var remain *ListNode
first := head
second := head.Next
if second != nil {
remain = second.Next
}
return remain, first, second
}
func swapPair(first, second *ListNode) (*ListNode, *ListNode) {
first.Next = nil
second.Next = first
return second, first
}