[前端]_一起刷leetcode 24. 两两交换链表中的节点

169 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目:

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

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

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

思路:

  1. 开辟一个新链表result,存储我们的结果;
  2. 用一个变量prev来记录当前result的最后一个节点,这样子拼接的时候直接通过prev.next即可;
  3. 每一轮我们拿出链表的两个节点,旋转后接入到result中;
  4. 遍历结束后,可能有剩余单个节点,也可能没有,直接接入到结果链表最后即可。

实现:

/**
 * 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) {
    // 开辟一个节点,返回直接取result.next; 这样子我们不用在循环中判断是否头节点
    let result = { val: 0, next: null };
    // 记录最后一个节点
    let prev = result;

    // 超过两个节点才能进行翻转
    while (head && head.next) {
        const temp = head.next;
        // 缓存节点,下一轮
        const next = temp.next;
        // 拆开链表,不然会形成闭环
        head.next = null;
        temp.next = head;
        prev.next = temp;
        prev = head;
        // 记得对链表进行往后传递,不然会无限循环
        head = next;
    }

    // 不管有没有剩余都直接接入
    prev.next = head;

    return result.next;
};

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。