「这是我参与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
思路:
- 这道题目可以用双指针来做,创建一个快指针
fast
和一个慢指针slow
; fast
先走k - 1
步, 这时候快指针停留的位置就是我们要替换的链表的位置;- 让快指针停留在原地不动,我们新增一个变量
cur
,让它接过fast
的接力棒,继续往后走; - 这时候慢指针
slow
和cur
一起以同样的速度往后跑; - 等到
cur
到达终点时,slow
离终点的距离刚好是k - 1
, 它也是我们要找的倒数第k个节点; - 交换
fast
和slow
的值,返回即可。
实现:
/**
* 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;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。