「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
题目描述 力扣
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 1 开始索引)。
举个例子
这是个有8个节点的链表,当k = 3时,就是要把第3个节点和倒数第3个节点的值交换
解题思路
核心就是找到第 k 个节点和倒数第 k 个节点。
- 找到第 k 个节点:用curr指向头节点,往后走
k-1步,就是第k个节点
- 找到倒数第 k 个节点:因为第 k 个节点到尾节点的距离和头节点到倒数第 k 个节点的距离一样,所以可以用两个指针从这两个位置用时走,curr 从第 k 个节点走,back 从头节点走,当 curr 走到尾节点时,back 的位置就是倒数第k个节点
- 交换 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
}
这道题就解完了,如有疑问欢迎提出一起讨论!