"""
https://leetcode-cn.com/problems/swap-nodes-in-pairs/solution/liang-liang-jiao-huan-lian-biao-zhong-de-jie-di-19/
思路:分为递归和迭代两种
方法I:递归
1.出口:当输入参数head=None或head.next=None,没有可交换,返回head并退出
2.定义此节点head对应的节点nextLN
3.1 head.next指向nextLN的后一节点
3.2 原nextLN的后一节点与它匹配节点进行递归交换
4.nextLN.next指向新节点head,完成当前节点交换
5.最后的nextLN为新链表头
方法II:迭代->交换链表需要用到3个指针:curLN,nextLN,prevLN来进行串连
1.定义dummyLN的listnode,并将其定义为prevLN
2.定义需要交换listnode,curLN=输入head;nextLN=head.next
3.交换,需要注意涉及4个链表结点
prevLN.next->nextLN
curLN.next->nextLN.next
nextLN.next->curLN
4.重新定义prevLN和head,下次进行交换
注意:迭代法需要一个dummy来记录head的位置保持不变
"""
class Solution:
#递归法
def swapPairs_Recursion(self, head):
if head==None or head.next==None:
return head
#定义当前节点对应交换的节点
nextLN=head.next
#当前head指向next.next
head.next=self.swapPairs_Recursion(nextLN.next)
#将next指向head,完成交换
nextLN.next=head
#返回最后的链表头
return nextLN
#迭代法
def swapPairs_Iteration(self, head):
dummyLN=ListNode(-1) #定义虚拟节点,用以指定返回值
dummyLN.next=head #将dummy节点指向head
prevLN=dummyLN #初始化prevLN
#循环直到没有可以交换
while head!=None and head.next!=None:
#定义节点信息
curLN=head
nextLN=curLN.next
#开始交换-------------------
prevLN.next=nextLN #前一结点->后一结点
curLN.next=nextLN.next #当前结点->后一结点的后结点
nextLN.next=curLN #后一结点->当前结点
#完成交换---------------------
#定义下次循环节点信息
prevLN=curLN
head=curLN.next
#返回值head
return dummyLN.next
来源:oschina
链接:https://my.oschina.net/tedzheng/blog/3215588