给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定 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