24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
迭代和递归实现

  • 示例 1:

输入:head = [1,2,3,4]
输出:[2,1,4,3]

  • 示例 2:

输入:head = []
输出:[]

  • 示例 3:

输入:head = [1]
输出:[1]

  • 来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs

  • 迭代:需要注意的是,每次迭代都需要把当前需要交换节点的前一个节点的指针修改为交换之后的节点,每次判断当前节点和next节点都有值
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next==nil {
        return head
    }

    pre, cur := head, head
    head = head.Next

    for cur != nil && cur.Next != nil {
        pre.Next, pre, cur.Next, cur.Next.Next, cur = cur.Next, cur, cur.Next.Next, cur, cur.Next.Next
    }

    return head
}
  • 递归:需要注意,递归之后
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next==nil {
        return head
    }

    next := head.Next

    head.Next,head.Next.Next = head.Next.Next,head

    head.Next = swapPairs(head.Next)

    return next
}