制作单网页网站wordpress区块链快讯模板
内容介绍
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2:
输入:head = [] 输出:[]示例 3:
输入:head = [1] 输出:[1]提示:
- 链表中节点的数目在范围
 [0, 100]内0 <= Node.val <= 100
完整代码
 struct ListNode* swapPairs(struct ListNode* head) {if (head == NULL || head->next == NULL) {return head;}struct ListNode* newHead = head->next;head->next = swapPairs(newHead->next);newHead->next = head;return newHead;
}
 
思路详解
-  
功能描述: 该函数
swapPairs接收一个链表的头节点head,并返回交换后的链表头节点。交换规则是:每两个相邻的节点进行交换。如果链表中的节点数为奇数,则最后一个节点保持不变。 -  
递归终止条件:
- 当链表为空(
head == NULL)或链表中只有一个节点(head->next == NULL)时,无需交换,直接返回当前头节点head。 
 - 当链表为空(
 -  
递归过程:
- 首先,定义一个新的头节点
newHead,指向当前头节点head的下一个节点。这是因为交换后,原来的第二个节点将成为新的头节点。 - 接着,将当前头节点
head的下一个节点的指针指向下一对节点交换后的头节点。这里使用了递归调用swapPairs(newHead->next),实现了链表的递归交换。 - 然后,将新的头节点
newHead的下一个节点指向当前头节点head,完成两两交换。 - 最后,返回新的头节点
newHead。 
 - 首先,定义一个新的头节点
 -  
递归展开过程: 假设链表为:1 -> 2 -> 3 -> 4 -> 5
- 第一次调用:head = 1,newHead = 2。交换后,链表变为:2 -> 1 -> 3 -> 4 -> 5
 - 第二次调用:head = 3,newHead = 4。交换后,链表变为:2 -> 1 -> 4 -> 3 -> 5
 - 第三次调用:head = 5,由于只有一个节点,直接返回,无需交换。
 
 -  
递归返回过程:
- 在递归返回过程中,每一层都会完成两两节点的交换,并将新的头节点返回给上一层,最终形成完整的交换后的链表。
 
 
知识点精炼
一、链表基本概念
- 链表是一种常见的基础数据结构,由一系列节点组成。
 - 每个节点包含两部分:数据域(存储数据)和指针域(指向下一个节点)。
 - 链表的第一个节点称为头节点,最后一个节点的指针指向空。
 
二、节点两两交换核心知识点
- 递归思想:通过递归调用实现节点交换,简化代码结构。
 - 递归终止条件:当链表为空或只剩一个节点时,无需交换,直接返回头节点。
 - 交换过程: 
- 定义新的头节点
newHead,指向原头节点的下一个节点。 - 将原头节点的下一个节点指向下一对节点交换后的头节点。
 - 将新头节点的下一个节点指向原头节点,完成两两交换。
 
 - 定义新的头节点
 
三、注意事项
- 交换过程中,需保持链表不断裂,正确处理指针指向。
 - 递归调用时,确保传入正确的参数,避免出现无限递归。
 - 考虑链表节点数为奇数的情况,最后一个节点保持不变。
 
四、实际应用
- 节点两两交换可用于解决一些特定问题,如链表排序、链表重构等。
 - 掌握节点交换技巧,有助于提高链表操作的灵活性和代码质量。
 

