## 题目地址 https://leetcode.com/problems/swap-nodes-in-pairs/description/ ## 题目描述 Given a linked list, swap every two adjacent nodes and return its head. You may not modify the values in the list's nodes, only nodes itself may be changed. Example: Given 1->2->3->4, you should return the list as 2->1->4->3. ## 思路 设置一个 dummy 节点简化操作,dummy next 指向 head。 1. 初始化 first 为第一个节点 2. 初始化 second 为第二个节点 3. 初始化 current 为 dummy 4. first.next = second.next 5. second.next = first 6. current.next = second 7. current 移动两格 8. 重复 ![24.swap-nodes-in-pairs](../assets/24.swap-nodes-in-pairs.gif) (图片来自: https://github.com/MisterBooo/LeetCodeAnimation) ## 关键点解析 1. 链表这种数据结构的特点和使用 2. dummyHead 简化操作 ## 代码 * 语言支持:JS,Python3 ```js /** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; * } */ /** * @param {ListNode} head * @return {ListNode} */ var swapPairs = function(head) { const dummy = new ListNode(0); dummy.next = head; let current = dummy; while (current.next != null && current.next.next != null) { // 初始化双指针 const first = current.next; const second = current.next.next; // 更新双指针和 current 指针 first.next = second.next; second.next = first; current.next = second; // 更新指针 current = current.next.next; } return dummy.next; }; ``` Python3 Code: ```python class Solution: def swapPairs(self, head: ListNode) -> ListNode: """ 用递归实现链表相邻互换: 第一个节点的 next 是第三、第四个节点交换的结果,第二个节点的 next 是第一个节点; 第三个节点的 next 是第五、第六个节点交换的结果,第四个节点的 next 是第三个节点; 以此类推 :param ListNode head :return ListNode """ # 如果为 None 或 next 为 None,则直接返回 if not head or not head.next: return head _next = head.next head.next = self.swapPairs(_next.next) _next.next = head return _next ```