携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第11天,点击查看活动详情
LeetCode 24:两两交换链表中的节点
题目描述
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
解题思路
思路一:递归
可以使用递归的方式实现两两交换链表中的节点。
递归的终止条件是链表中没有节点,或者链表中只有一个节点。
解题代码如下:
var swapPairs = function (head) {
if (head === null || head.next === null) {
return head;
}
const newHead = head.next;
head.next = swapPairs(newHead.next);
newHead.next = head;
return newHead;
};
时间复杂度: O(n); n 是链表总节点数, 需要对每个节点进行更新指针的操作
空间复杂度: O(n); n 是链表总节点数, 空间复杂度主要取决于递归调用的栈空间;
思路二:迭代
思路如下:
-
创建哑结点dummy, dummy.next = head,设置current表示当前到达的节点,初始时current = dummy。每次需要交换
temp后面的两个节点。 -
如果 current 的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。
-
否则,获得 current 后面的两个节点 n1 和 n2,通过更新节点的指针关系实现两两交换节点。
-
两两交换链表中的节点之后,新的链表的头节点是
dummy.next,返回新的链表的头节点即可
实现代码如下:
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function (head) {
let dummy = new ListNode(undefined, head);
let current = dummy, n1, n2;
while (current.next !== null && current.next.next !== null) {
n1 = current.next;
n2 = current.next.next;
n1.next = n2.next;
n2.next = n1;
current.next = n2;
current = n1;
}
return dummy.next;
};
时间复杂度: O(n);n 是链表总节点数, 需要对每个节点进行更新指针的操作
空间复杂度: O(1)