两两交换链表中节点

题:给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

首先先介绍一下递归思想(这里是看了一个大佬的github博客)

递归其实就是反复调用自身的过程,它每个过程都是一样的,我们只需关注一级的递归就可以,如果你要思考每级递归如何返回值给上一级的话这就大伤脑筋而且没有必要了。

递归需要考虑三个方面:

  • 递归终止条件(如本例终止条件就是算法思路里面的第一点)
  • 一级递归需要干什么(本例中需要把前两个节点交换并且和后边已经处理过的链表接上)
  • 每级递归的返回值应该是什么(本例中返回值为已经处理好的链表)

递归就看这三个方面就行,其实也不是很难嘛。接下来看如何用递归实现本例。

算法思路:
  1. 首先判断头指针和下一个指针是否为空,因为如果为空就无法进行交换。
  2. 条件1不满足那么就可以进行交换啦。原来的链表顺序为head->next->OK(OK指已经处理过的链表),现在我们需要交换head和next,使之变为next->head->OK,这个过程就不用我说了吧,再不会这个数据结构老师打你哦。
  3. 既然每次递归都是返回处理好的链表,原来顺序是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/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值