解法一:递归
如果我设法将前2个节点反转,那么后面的节点怎么处理?其实也是一条链表,只不过长度更小,可以直接递归调用,这就是子问题结构。
/**
* 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
}
first := head
second := head.Next
others := head.Next.Next
// 先翻转前两个节点
second.Next = first
// 递归翻转后面的两两节点,并接到当前两个节点后面
first.Next = swapPairs(others)
// 返回新的头节点
return second
}
解法二:迭代法
/**
* 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
}
dummy := &ListNode{Val:-1, Next:head}
pre, cur := dummy, head
for cur != nil && cur.Next != nil{
// 记录当前两节点翻转后的下一节点
nxt := cur.Next.Next
// 执行翻转
pre.Next = cur.Next
cur.Next.Next = cur
cur.Next = nxt
// 处理下一轮
pre = cur
cur = nxt
}
return dummy.Next
}