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

119 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情

今天讲解的是链表系列的1道题:

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

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

leetcode地址: leetcode.cn/problems/sw…

难度

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100

解法

  1. 定义虚拟头节点 dummyHead,指向头节点的前一个节点,也就是 dummyHead.next = head
  2. 我们来定义如下图的4个指针
  3. 首先定义指针p,指向虚拟头节点,也是 let p = dummyHead;
  4. 因为要用的node2,而node2是p.next.next。所以遍历链表的条件是当p.next && p.next存在的时候
  5. 然后定义指针node1,初始值是 p.next
  6. 定义指针node2,初始值是 p.next.next,也就是node1.next
  7. 定义指针next,初始值是node2.next
  8. 然后开始交换链表,将node2指向node1,也就是node2.next = node1
  9. 将node1指向next,也就是node1.next = next
  10. 然后将p指向node2,将链表链接起来,也就是p.next = node2
  11. 将 p 移动到node1 ,进行下一次的穿针引线
  12. 最后返回虚拟头节点的下一个节点,也就是dummyHead.next

代码

/*
 * @lc app=leetcode.cn id=24 lang=javascript
 *
 * [24] 两两交换链表中的节点
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    // 定义虚拟头节点
    let dummyHead = new ListNode(0);
    dummyHead.next = head; // 将虚拟头节点链接第一个节点

    let p = dummyHead;  // 定义指针p 指向虚拟头节点
    while(p.next && p.next.next){
        let node1 = p.next;     // 定义node1
        let node2 = node1.next; // 定义node2
        let next = node2.next;  // 定义next
 
        node2.next = node1;   // 将node2指向node1
        node1.next = next;    // 将node1指向next
        p.next = node2;       // 将p指向node2

        p = node1;  // 将p 移动到node1,进行下次穿针引线
    }
    return dummyHead.next;
};
// @lc code=end