算法题
链表(linked list)
两两交换链表中的节点

两两交换链表中的节点

题目

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

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

示例 2:

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

示例 3:

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

思路

使用虚拟头结点,这样会方便很多,要不然每次针对头结点(没有前一个指针指向头结点),还要单独处理。

第一种方法是使用递归

第二章方法是使用迭代

解法

使用递归:

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
}

使用迭代:

func swapPairs(head *ListNode) *ListNode {
    dummy := &ListNode{Next: head}
    pre := dummy
    for pre.Next != nil && pre.Next.Next != nil {
        // 获取当前节点的下一个节点
        a := pre.Next
        // 获取当前节点的下一个节点的下一个节点
        b := a.Next
        // 交换
        pre.Next, a.Next, b.Next = b, b.Next, a
        // 移动到下一个节点
        pre = a
    }
    return dummy.Next
}