Leetcode做题日记:24. 两两交换链表中的节点(PYTHON)

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

        L=ListNode(0)
        L.next=head
        s1=L
        SS=ListNode(0)
        ss=SS  #在链表操作时,备一个副本,做最后的输出
        a1=s1.next
        if a1==None:
            return []
        a2=s1.next.next
        while a1!=None or a2!=None: 
            if a1==None:
                break  #因为a2也为None,不用操作了
            if a2==None:
                bb1=ListNode(a1.val) #新建一个结点储存这个值
                ss.next=bb1 #把这个节点分配给ss.next
                break
            bb1=ListNode(a2.val)
            ss.next=bb1
            ss=ss.next #更新结点为下一个节点,即到现在bb1的这个节点
            bb1=ListNode(a1.val)
            ss.next=bb1 #这里的next指的是分配下一个新节点给bb1
            ss=ss.next #相当于指针指到新bb1这个节点
            
            s1=s1.next.next #更新值
            a1=s1.next
            if a1==None: #如果无法更新,说明结束
                break
            a2=s1.next.next
            
                
        return SS.next #返回副本的.next
        
28ms,只击败了48%
下次可尝试通过改变链表.next来做    
第一次的代码
永远超出时间限制,赋值不对,这里a1=s1.next,a1就是一个链表啊,怎么会为None呢,所以,只能换成a1.val,就是当前节点了,那么,用新的ListNode(a1.val)来把这个值变成节点
        a1=s1.next
        a2=s1.next.next
        while a1!=None or a2!=None:
            if a1==None:
                break
            if a2==None:
                ss.next=a1
                break
            ss.next=a2
            ss=ss.next
            ss.next=a1
            ss=ss.next
            
            s1=s1.next.next
            
            a1=s1.next
            a2=s1.next.next
            
                
        return SS.next 
     

第三次代码:

		#新建3个一样的新链表,next=都等于ead
        s=ListNode(-1)
        s.next=head
        s1=s
        s2=s
        #当当前s1无法再交换的时候,结束,若s1.next空,则s1.next.next不存在的
        while s1.next and s1.next.next:
            a=s1.next#第一个值
            b=s1.next.next#第二个值
            a.next=b.next#设置第一个值的next,既然交换
            b.next=a#完成交换
            s2.next=b#赋给s2
            s1=s2.next.next#准备交换下两个
            s2=s2.next.next#准备接受下两个
        return s.next

你可能感兴趣的:(leetcode)