[路飞]_前端算法第十九弹-1721. 交换链表中的节点

309 阅读2分钟

「这是我参与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赋值,否则将形成闭环。