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

239 阅读2分钟

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

题目:

1721. 交换链表中的节点

难度中等35收藏分享切换为英文接收动态反馈

给你链表的头节点 head 和一个整数 k 。

交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。

 

示例 1:

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

示例 2:

输入: head = [7,9,6,6,7,8,3,0,9,5], k = 5
输出: [7,9,6,6,8,7,3,0,9,5]

示例 3:

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

示例 4:

输入: head = [1,2], k = 1
输出: [2,1]

示例 5:

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

 

提示:

  • 链表中节点的数目是 n
  • 1 <= k <= n <= 105
  • 0 <= Node.val <= 100

思路:

  1. 这道题目可以用双指针来做,创建一个快指针fast和一个慢指针slow
  2. fast先走k - 1步, 这时候快指针停留的位置就是我们要替换的链表的位置;
  3. 让快指针停留在原地不动,我们新增一个变量cur,让它接过fast的接力棒,继续往后走;
  4. 这时候慢指针slowcur一起以同样的速度往后跑;
  5. 等到cur到达终点时,slow离终点的距离刚好是 k - 1, 它也是我们要找的倒数第k个节点;
  6. 交换fastslow的值,返回即可。

实现:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} k
 * @return {ListNode}
 */
var swapNodes = function(head, k) {
    let fast = head;
    let slow = head;

    // 快指针先走k - 1步, 就刚好停留在k位
    while  (k > 1) {
        k--;
        fast = fast.next;
    }

    let cur = fast.next;

    // 齐头并进, cur到终点, slow离终点正好是k - 1
    while (cur) {
        cur = cur.next;
        slow = slow.next;
    }

    // 交换位置
    [slow.val, fast.val] = [fast.val, slow.val];
    return head;
};

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