LeetCode.24|两两交换链表中的节点

别等时光非礼了梦想. 提交于 2020-04-05 17:46:27
"""
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

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!