LeetCode算法学习之--链表--两两交换

760 阅读2分钟

大家好今天给大家分享下一道 LeetCode 中等难度 的题目[两两交换链表中的节点](leetcode-cn.com/problems/co…)

这里主要是分享思路和注释,供大家更好的理解题目解法,代码部分是参考LeetCode 转写成javascript 代码,

题目

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

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。(图片来自leetcode)

示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:

输入:head = []
输出:[]
示例 3:

输入:head = [1]
输出:[1]


分析

1.两两交换 可以指针+迭代

2.利用递归

解法一: 迭代+双指针

代码转载 leetcode-cn.com/problems/sw…

思路
1.连续3个数为一组
2.由于需要三个数,所以需要一个dummy的数
3.在循环中进行 位置交换,然后移动一个temp指针
3.当temp.next===null 和 当temp.next.next===null 的时候结束循环 
*/

var swapPairs = function (head) {
  const dummy = new ListNode(0);
  dummy.next = head;
  let temp = dummy;

  // 当运行到最后一轮循环的时候,当链表为偶数的时候 temp.next ==null 当链表为奇数的时候temp.next.next ===null
  // 注意这里必须是&& 因为要保证两两一个组
  while (temp.next !== null && temp.next.next !== null) {
    // 列出需要交换的2个点
    const node1 = temp.next;
    const node2 = temp.next.next;

    // 交换节点的位置
    temp.next = node2;
    node1.next = node2.next;
    node2.next = node1;
    temp = node1;
  }

  return dummy.next;
};

/* 复杂度
时间 O(n)
空间 O(1)
*/

解法二:递归

代码转载 leetcode-cn.com/problems/sw…

思路
1.终止条件 当链表为偶数的时候 最后一个 Headnull1,2】,
例如 2.next 为null, 为奇数的时候 head.nextnull,例如 [1,2,3] 2.next.nextnull

2.递归内做的事情
    1.存储下一个节点的值 temp
    2.head.next 指向交换后的节点
    3.temp 指向head
    4.返回temp
*/
var swapPairs = function (head) {
  if (head === null || head.next === null) {
    return head;
  }

  const temp = head.next;
  head.next = swapPairs(temp.next);
  temp.next = head;
  return temp;
};

/* 复杂度
  时间 O(n)
  空间 O(n)
  */
/* 



总结

这道题 ,考察的是对链表的指针移动的理解,通过递归和迭代的方式,大家可以尝试多多练习。

大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢

文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com