【路飞】leetcode-24. 两两交换链表中的节点

145 阅读1分钟

加油 第 8 练

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

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

递归
  • 新链表头节点 newHead 为原链表的第二个节点,newHead = head.next
  • 新链表的第二个节点为原链表的头节点,newHead.next = head
  • 返回 newHead
var swapPairs = function(head) {
    if(!head || !head.next){
        return head
    }
    const newHead = head.next
    head.next = swapPairs(newHead.next)
    newHead.next = head
    return newHead
};
迭代
  • 设置虚拟头节点 dummyHead,令当前到达的节点temp初始时指向dummyHead
  • dummyHead后面存在至少两个节点(temp.next && temp.next.next),node1为dummyHead后第一个节点,node2为dummyHead后第二个节点
  • 两两交换节点:
    • temp.next指向node2
    • node1.next指向node2.next
    • node2.next指向node1
    • 指针后移
var swapPairs = function (head) {
    let dummyHead = new ListNode(0);
    dummyHead.next = head
    let temp = dummyHead

    while(temp.next && temp.next.next){
        const node1 = temp.next
        const node2 = temp.next.next
        // 两两交换
        temp.next = node2
        node1.next = node2.next
        node2.next = node1
        // 指针后移
        temp = node1
    }
    return dummyHead
};