题目描述

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

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

示例 2: 输入:head = []
输出:[]

示例 3: 输入:head = [1]
输出:[1]

思路&js代码

1、迭代

  • 哨兵节点简化逻辑
  • node0、node1、node2、node3
var swapPairs = function(head) {
    const dummy = new ListNode(0, head); // 用哨兵节点简化代码逻辑
    let node0 = dummy;
    let node1 = head;
    while (node1 && node1.next) { // 至少有两个节点
        const node2 = node1.next;
        const node3 = node2.next;
 
        node0.next = node2; // 0 -> 2
        node2.next = node1; // 2 -> 1
        node1.next = node3; // 1 -> 3
 
        node0 = node1; // 下一轮交换,0 是 1
        node1 = node3; // 下一轮交换,1 是 3
    }
    return dummy.next; // 返回新链表的头节点
};

2、递归

更好理解点

var swapPairs = function(head) {
    if (head === null || head.next === null) {
        return head;
    }
 
    const node1 = head;
    const node2 = head.next;
    const node3 = node2.next;
 
    node1.next = swapPairs(node3); // 1 指向递归返回的链表头
    node2.next = node1; // 2 指向 1
 
    return node2; // 返回交换后的链表头节点
};