Leetcode算法-两两交换链表节点(循环法+递归法)

今天做了一条Leetcode的算法题,感觉从一道算法题里学到许多,于是通过这篇博客记录下来。

题目非常简单:

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

比如一个链表1->2->3->4 需要你将链表中两两节点互换,输出2->1->4->3。

第一种方法就是循环遍历的方法:直接遍历整个链表,然后两两交换一下

代码如下:

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        #首先,需要在头节点之前添加一个空节点hair,如果没有hair节点的话,
        #后面的节点就无法正常的交换
        hair=ListNode(None)
        hair.next=head
        p=hair
        #当p节点之后存在两个节点的时候,才进行交换
        while p.next and p.next.next:
            first,second=p.next,p.next.next
            #这个交换的顺序很重要,千万不能互换,否则会引起后续节点的缺失
            p.next=second
            first.next=second.next
            second.next=first
            #已经交换了两个节点,所以直接移动到第二个节点的后面
            p=second.next
        #记得不要返回头部我们添加的空节点
        return hair.next

对于链表中指针的交换过程,自己画的一个简单的图:

在这里插入图片描述
然而这种方法的执行结果并不尽如人意:
在这里插入图片描述

然后看了评论区的大神们,发现可以通过递归的方式解决,然而这个方法(个人观点)还是比较难以理解的,我先放上代码:

class Solution:
    def swapPairs(self, head: ListNode) -> ListNode:
        #首先定义递归的出口:当head本身为空或者head是最后一个节点,没有
        #后续的节点来跟他进行交换的时候,直接返回head
        if not head or not head.next:
            return head
        #first和second就是我们需要交换的两个节点
        first = head
        second = head.next
        #递归调用函数
        first.next = self.swapPairs(second.next)
        #改变指针方向并且返回
        second.next = first
        return second

这个过程,却是还是挺抽象的,但是我们如果按照代码执行的步骤来画一个草图理解起来就方便多了

我们首先来看1->2->3->4->5这样一个链表:
在这里插入图片描述
篇幅有限 所以就只写了一次子函数的调用,其实后面的都是一样的

然后采用递归的方式解决的话,时间有了一定的提高
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值