当前位置:   article > 正文

Leetcode算法-两两交换链表节点(循环法+递归法)_leetcode 交换相邻的2个链表

leetcode 交换相邻的2个链表

今天做了一条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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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

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

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

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
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

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

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/程序代码艺术家2/article/detail/61283
推荐阅读
相关标签
  

闽ICP备14008679号