力扣24题的两种解法
可以采用递归和非递归两种思路解题,其实两种思路类似,都是分块两两解决。
递归方法
- 首先假设
swapPairs
方法已经存在并能解决问题;1
2
3func swapPairs(head *ListNode) *ListNode{
...
} - 找到结束条件
因为是两两交换,那么head不存在或者head的下一个节点不存在就说明已经没有可以交换的节点了,直接返回head即可;1
2
3if head == nil || head.Next == nil {
return head
} - 单次交换步骤
- 找到head的下一节点
next := head.Next
- 将head的下一节点设置为
next
节点后面的节点,我们把next
节点后面的节点next.Next
单独看成一个链表的头节点,那么只需要用swapPairs
处理后面的节点即可:1
head.Next := swapPairs(next.Next)
- 最后把
next
节点的下一个节点指向head
节点就交换完成了:1
next.Next = head
- 找到head的下一节点
- 找到返回值
因为swapPairs
方法的目的是两两交换,那么交换后,next
节点就是交换后的头节点了,返回next
节点即可:下面是完整代码:1
return next
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func swapPairs(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
next := head.Next
head.Next = swapPairs(next.Next)
next.Next = head
return next
}
非递归方法
非递归采用三个指针,分别
- 指向当前组的第一个节点的
curr
- 指向
curr
上一个节点的prev
- 指向下一组第一个节点的
next
循环开始条件,当前节点不为空并且下一节点也不为空:
1 | curr != nil && curr.Next != nil |
单次循环交换步骤
- 记录下一组第一个节点
next
: - 把
prev
下一个节点指向curr
的下一个节点 - 把
curr.Next
下一个节点指向curr
节点 - 把
curr
的下一节点指向下一组的第一个节点完成交换 - 修改
prev
指针指向curr
,即为下一组第一个节点的上一个节点 - 修改
curr
指针指向next
,即为下一组第一个节点 - 循环完成
完整代码如下:
1 | func swapPairs(head *ListNode) *ListNode { |