24. 两两交换链表中的节点
mid
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
迭代
简单
用个伪头节点记录初始位置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| func swapPairs(head *ListNode) *ListNode {
fakeHead := &ListNode{Next: head}
pre := fakeHead
for pre.Next != nil && pre.Next.Next != nil {
p, q := pre.Next, pre.Next.Next
// p q 交换
pre.Next = q
p.Next = q.Next
q.Next = p
pre = p
}
return fakeHead.Next
}
|
递归
先交换头两个节点,之后的节点递归交换,其实还是迭代的思想
1
2
3
4
5
6
7
8
9
10
11
12
| func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
p, q := head, head.Next
p.Next = q.Next
q.Next = p
p.Next = swapPairs(p.Next)
return q
}
|