24 两两交换链表中的节点-中等

题目:

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

解题思路

这道题有2种解法。一种是先交换前两个,然后递归交换后面的,详见解法1。

第二种解法是迭代版本,思路一样。

// date 2023/10/17
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
// 解法1
func swapPairs(head *ListNode) *ListNode {
    // basic case
    if head == nil || head.Next == nil {
        return head
    }
    var newHead *ListNode
    unSwap := head.Next.Next // save un-swap node
    newHead = head.Next      // find the new head
    newHead.Next = head      // update next pointer of new head
    head.Next = swapPairs(unSwap)  // swap others
    return newHead
}

先找出新的头节点,并保存两两交换后的第二个节点,用于更新其Next指针。

// date 2022/10/09
// 解法2
func swapPairs(head *ListNode) *ListNode {
    if head == nil || head.Next == nil {
        return head
    }
    var nHead *ListNode
    // 1. 找到新的头节点
    nHead = head.Next
    // save unswap list
    after := nHead.Next
    p1, p2 := head, head.Next
    p1.Next = after
    p2.Next = p1
    // 2. 继续交换
    pre := p1
    p1 = after
    for p1 != nil && p1.Next != nil {
        p2 = p1.Next
        after = p2.Next
        p1.Next = after
        p2.Next = p1
        pre.Next = p2
        pre = p1
        p1 = after
    }
    return nHead
}

最后更新于