「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
给你链表的头节点 head 和一个整数 k 。
交换 链表正数第 k 个节点和倒数第 k 个节点的值后,返回链表的头节点(链表 从 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]
这道题中,我们有一个链表head和一个整数k,我们需要将链表从前向后和从后向前两个位置的K的值互换,所以我们需要知道正数第K个节点的值,和倒数第K个节点的值。由于我们不知道节点的长度,我们无法得知倒数第K个值在正数的情况下是第几个节点, 这道题我们就可以使用双指针的方法,我们假定fast指针和slow指针都指向head,当fast指针先走到正数的节点的时候,此时节点的长度就变成了head的长度减去K的值假定为K2节点,此时slow节点只需要走到这个节点便是从后向前数的第K个节点的值。
即,假定长度为5,K为2,那么倒数K就是3,也就是5-2=3。
所以我们使用代码实现便是
var swapNodes = function (head, k) {
// 将用于遍历的dummy,和快fast慢slow指针都指向head
let dummy = head;
let fast = head;
let slow = head;
// 节点计数器
let count = 1;
// 遍历终止条件
while (dummy.next != null) {
// count < k 时,快节点遍历到正数K的位置
if (count < k) {
fast = fast.next
count++
} else {
// 慢节点遍历到倒数K节点的位置
slow = slow.next
}
dummy = dummy.next
}
// 替换快慢节点的val值
const temp = fast.val;
fast.val = slow.val;
slow.val = temp;
return head
};
此题给我们进行了相对简化,因为我们只需要替换两个节点的val即可,不需去考虑next节点的问题,所以我们直接换val,就好,如果说是替换两个节点,那么则在此基础上还需要进行next的替换,以及末位null赋值,否则将形成闭环。