[路飞]_交换链表中的节点

361 阅读1分钟

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

题目描述 力扣

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

举个例子

1.png

这是个有8个节点的链表,当k = 3时,就是要把第3个节点和倒数第3个节点的值交换

解题思路

核心就是找到第 k 个节点和倒数第 k 个节点。

  1. 找到第 k 个节点:用curr指向头节点,往后走k-1步,就是第k个节点

g2.gif

  1. 找到倒数第 k 个节点:因为第 k 个节点到尾节点的距离和头节点到倒数第 k 个节点的距离一样,所以可以用两个指针从这两个位置用时走,curr 从第 k 个节点走,back 从头节点走,当 curr 走到尾节点时,back 的位置就是倒数第k个节点

g3.gif

  1. 交换 front 和 back 的值

代码实现

var swapNodes = function(head, k) {
    if (!head || !head.next) return head

    let curr = head
    let front = back = null

    //找第k个节点
    while (--k) {
        curr = curr.next
    }

    front = curr

    //找到倒数第k个节点
    while (curr.next) {
        curr = curr.next
        back = back.next
    }

    //交换值
    [front.val, back.val] = [back.val, front.val]
    return head
}

这道题就解完了,如有疑问欢迎提出一起讨论!