Day2,两两交换链表中节点的递归C语言实现
题:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
首先先介绍一下递归思想(这里是看了一个大佬的github博客)
递归其实就是反复调用自身的过程,它每个过程都是一样的,我们只需关注一级的递归就可以,如果你要思考每级递归如何返回值给上一级的话这就大伤脑筋而且没有必要了。
递归需要考虑三个方面:
- 递归终止条件(如本例终止条件就是算法思路里面的第一点)
- 一级递归需要干什么(本例中需要把前两个节点交换并且和后边已经处理过的链表接上)
- 每级递归的返回值应该是什么(本例中返回值为已经处理好的链表)
递归就看这三个方面就行,其实也不是很难嘛。接下来看如何用递归实现本例。
算法思路:
- 首先判断头指针和下一个指针是否为空,因为如果为空就无法进行交换。
- 条件1不满足那么就可以进行交换啦。原来的链表顺序为head->next->OK(OK指已经处理过的链表),现在我们需要交换head和next,使之变为next->head->OK,这个过程就不用我说了吧,再不会这个数据结构老师打你哦。
- 既然每次递归都是返回处理好的链表,原来顺序是head->next,处理之后链表变为next->head,所以为了和前面要处理的链表接起来就应该返回处理好之后的头结点为next,所以递归返回值应为next。
ok,接下来直接上代码:
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* swapPairs(struct ListNode* head){
if(head == NULL||head->next == NULL) return head;//递归出口即终止条件
//交换
struct ListNode* next = head->next;
head->next = swapPairs(next->next);//把处理好的链表接上
next->next = head;
return next;
}
看一下运行结果咋样(这里只给了主要部分代码,需要运行自己添上剩下的代码)
OK,完美实现。最后附上那位大佬的博客https://lyl0724.github.io/2020/01/25/1/