0024-Swap-Nodes-in-Pairs/Article/0024-Swap-Nodes-in-Pairs2.md
本文首发于公众号「图解面试算法」,是 图解 LeetCode 系列文章之一。
题目来源于 LeetCode 上第 24 号问题:两两交换链表中的节点。
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
由题目描述可知需要两两交换, 那么以两个为一组子链表交换指针即可, 在设置一个 哨兵 指向交换后的子链表 (或者哨兵提前指向子链表的第二个节点,因为第二个节点交换后就成了第一个节点); 然后让哨兵指向下一组子链表,继续交换,直至最后.
设 哨兵 为 节点 prev, 子链表第一个节点为 A, 第二个节点为 B, 第三个节点为 C, 那么操作流程如下:
head == null && head -> next == null
/**
* JavaScript描述
* 迭代法
*/
var swapPairs = function(head) {
let dummy = new ListNode(0);
dummy.next = head;
let prevNode = dummy;
while (head !== null && head.next !== null) {
// Nodes to be swapped
let firstNode = head,
secondNode = head.next;
// Swapping
prevNode.next = secondNode; // 放到交换前后都可以
firstNode.next = secondNode.next;
secondNode.next = firstNode;
// Reinitializing the head and prevNode for next swap
prevNode = firstNode;
head = firstNode.next;
}
return dummy.next;
};
递归的思路和迭代类似, 都是分组交换. 具体来说这里的递归不是针对一个问题深入进去,而是不断向后推进.
注意: 不要人肉递归, 更多关注整体逻辑
示例执行大致流程为:
(head == null) || (head.next == null)
/**
* JavaScript描述
* 递归法
*/
var swapPairs = function(head) {
if (head == null || head.next == null) {
return head;
}
// Nodes to be swapped
let firstNode = head,
secondNode = head.next;
// Swapping
firstNode.next = swapPairs(secondNode.next);
secondNode.next = firstNode;
return secondNode;
};