24.Two-twoswapnodesinlinkedlist来源:https://leetcode-cn.com/problems/swap-nodes-in-pairs题目给定一个链表,将相邻节点两两交换,返回交换后的链表。您不能只更改节点内的值,但您需要实际交换节点。示例:给定1->2->3->4,您应该返回2->1->4->3。解题思路在这个问题中,需要进行实际的节点交换,而不仅仅是简单的改变节点内部的值。这里,其实有两种思路:递归和非递归,但是核心思想是相似的,都是交换相邻节点的链表形式,完成整个链表的调整。思路一:使用递归时,需要明确终止条件。其次,不要急于从完整的调用栈入手,这样很容易无从下手。递归主要是不断重复同一件事情,但是遇到终止条件会逐层返回。这种情况下可以考虑关注第一层调用单元。在这里,我们首先需要明确:终止条件,返回内容,当前层的调用单元具体做了什么。然后看这道题:终止条件:head为空,或者head.next为空。这意味着链表没有节点,或者只有一个节点,以至于无法交换,这是终止条件。返回内容:交换完成后返回子链表。调用单元:这里设置前后节点front_node,tail_node,交换两个节点,交换完成后front_node连接子链表,tail_node连接front_node。这就是递归的思想。思路二:非递归非递归和递归的思路其实差不多。设置前后节点front_node和tail_node。核心也是交换前后节点,但是要加上辅助节点pre,记录front_node的前节点。具体算法:定义前后节点front_node、tail_node;交换前后节点;更新前。具体代码实现如下。代码实现递归#Definitionforsingle-linkedlist.#classListNode:#def__init__(self,x):#self.val=x#self.next=Noneclass解决方案:defswapPairs(self,head:ListNode)->ListNode:#如果链表为空,或者只有一个节点,则直接返回head如果不是head或者不是head.next:returnhead#需要交换的前后节点front_node=headtail_node=head.next#交换节点front_node.next=self.swapPairs(tail_node.next)tail_node.next=front_nodereturntail_nodenon-recursive#单链表的定义。#classListNode:#def__init__(self,x):#self.val=x#self.next=NoneclassSolution:defswapPairs(self,head:ListNode)->ListNode:#dummy简化边界条件dummy=ListNode(-1)dummy.next=headpre=dummywhileheadandhead.next:front_node=headtail_node=head.next#exchangepre.next=tail_nodefront_node.next=tail_node.nexttail_node.next=front_node#resetpre,headpre=front_nodehead=front_node.nextreturndummy.next实现结果recursiveresult:non-recursiveresult:以上是使用递归的思路而非递归,是解决《两两交换链表中的节点》问题的主要内容是交换链表的相邻节点。欢迎关注微信公众号《书所集录》
