题目来源:. - 力扣(LeetCode)
题目思路分析
题目 :给定一个单链表的头节点 head
,请你编写一个函数,将链表中的节点成对交换,返回交换后的链表头节点。
思路:
- 递归法 :
- 终止条件:如果链表为空或只有一个节点,直接返回该节点。
- 递归步骤 :
- 设定一个新的头节点
newhead
为当前头节点的下一个节点(即要交换的第二个节点)。 - 递归调用
swapPairs
函数,传入newhead->next
(即当前要处理的对之后的链表部分),并将结果赋值给当前头节点的next
。 - 将
newhead
的next
指向当前头节点,完成这一对节点的交换。 - 返回新的头节点
newhead
。
- 设定一个新的头节点
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
// 如果链表为空或只有一个节点,直接返回该节点
if(head==NULL || head->next==NULL){
return head;
}
// newhead 是当前要交换的第二个节点,也就是新链表的头节点
ListNode* newhead=head->next;
// 递归调用 swapPairs 函数,传入 newhead->next,即当前要处理的对之后的链表部分
// 将结果赋值给当前头节点的 next,完成递归链表的构建
head->next=swapPairs(newhead->next);
// 将 newhead 的 next 指向当前头节点,完成这一对节点的交换
newhead->next=head;
// 返回新的头节点 newhead
return newhead;
}
};
知识点摘要
- 链表基础 :
- 链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。
- 单链表是指每个节点只有一个指向下一个节点的指针。
- 递归 :
- 递归是一种解决问题的方法,其中函数直接或间接地调用自身。
- 递归函数通常包含一个或多个基准条件,用于终止递归调用。
- 链表节点交换 :
- 链表节点交换通常涉及调整节点间的指针,而不是数据值本身。
- 在本问题中,通过调整指针实现节点对的交换。
通过这道题目,我们学会了如何使用递归方法解决链表节点成对交换的问题。递归方法虽然简洁,但也需要仔细考虑基准条件和递归步骤,以避免陷入无限递归或导致内存泄漏。此外,对链表操作的理解也是解决此类问题的关键,特别是节点指针的调整。通过实践,我们可以更好地掌握递归和链表操作的相关知识,为更复杂的问题打下坚实的基础。