链表交换相邻元素

256 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

链表交换相邻元素

描述

给你一个链表,两两交换相邻的节点,并返回交换后的链表的头节点。需要注意的是,你不能通过直接修改节点值来完成链表交换要求,需要真实交换相邻元素。

如下图所示:

image.png

原链表元素1和元素2交换,元素3和元素4交换生成新的链表。

分析

  1. 当链表中元素没有或者只有一个的时候,就不存在交换相邻元素的操作,故直接返回本身
  2. 因为我们是交换相邻元素,那所有的交换操作思路都是一样的,我们可以用同一个方法来重复实现,那就是递归操作,不断重复交换相邻的两者
  3. 现在的问题就只剩下如何交换相邻两者元素了:总体来说,我们让原链表第一个元素next指针指向第三个元素,第二个元素next指针指向第一个元素即可
  4. 我们先存储一个变量是第二个元素,再执行将第一个元素的next指向第三个元素,之所以要存储第二个元素,是因为经过第一步操作后第二个元素就相当于从原链表中删除了,无法直接找到
  5. 第一个元素处理后,然后就将第二个元素的next指针指向原第一个元素,这样就完成了第一轮相邻元素的交换操作
  6. 将递归方法的返回值赋值给第二个元素的next指针,这样就完成了整个链表的相邻元素交换操作

程序实现

根据上述分析,实现的代码如下:

var swapPairs = function(head) {
  if (!head || !head.next) return head
  // 先存储第二个元素,否则第一个元素的next指针转移,则无法找到第二个元素
  const sec = head.next
  // 第一个元素的next指向第三个元素
  head.next = sec.next
  // 第二个元素的next指向第一个元素
  sec.next = head
  sec.next.next = swapPairs(head.next)
  return sec
};