原文:24. 两两交换链表中的节点(leetcode 高频面试题) - 每天一个JavaScript小知识@Js中文网 · 码农进阶题库

原文地址:https://www.javascriptc.com/interview-tips/zh_cn/leetcode/leetcode-javascript-solution-024/

题目:

难度:Middle

相关话题:链表

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值 ,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

思路:

假设一组内含有2个节点,定义一个startNode为每一组的前一个节点(方便两两交换),初始为一个空节点new ListNode(null)

每次检查nodenode.next都存在,说明当前组有效的,是不缺少节点的。

例如[1,2,3],初始startNode为额外空节点,第一次检查Node(1)Node(2)都存在,只需要将两个交换后得到[2,1,3]

接着,更新startNodeNode(2),第二次检查只有Node(3)存在,当前组只有1个节点,退出循环。

/**
 * @来源: Javascript中文网 - 前端进阶资源教程 https://www.javascriptc.com/
 * @介绍:一个致力于帮助开发者用代码改变世界为使命的平台,每天都可以在这里找到技术世界的头条内容
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
  if(!head)return null
  let root=new ListNode(null)
  root.next=head
  let startNode=root
  let node=root.next
  while(node && node.next){
    let nxt=node.next
    node.next=nxt.next
    startNode.next=nxt
    nxt.next=node
    startNode=node
    node=node.next
  }
  return root.next
};