大家好今天给大家分享下一道 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.终止条件 当链表为偶数的时候 最后一个 Head 为null【1,2】,
例如 2.next 为null, 为奇数的时候 head.next为null,例如 [1,2,3] 2.next.next 为null
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