题目1 翻转链表 I
样例
给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null
这篇文章用图片很好的解释了翻转链表的常用的几种方法
我这里写一下方法2,3的python实现。
方法2:每两个相邻的节点依次翻转
def reverse2(head):
p=head
q=head.next
head.next=None #head是新表的尾部
while q:
r=q.next
q.next=p
p=q
#只是给q节点赋予了p的名字,使得下一次循环进行同样操作
q=r
return p
方法3:
依次将第2个到第最后一个end节点移到head节点后面,最后将链表连城环,然后选之前的end节点作为新的表头。
def reverse3(head):
p=head.next
while p and p.next:
q=p.next
p.next=q.next
q.next=head.next
head.next=q
p.next=head
newhead=p.next.next
p.next.next=None
return newhead
小结,在写代码时候,其实思路很简单,例如在这一行将a.next赋予了b,那么在下一行,就应该有一个值赋给a.next。这两种方法的结构都是如此。
题目2 翻转链表 II
翻转链表中第m个节点到第n个节点的部分
样例
给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null
分析:
要做主要工作是把m到n之间的一段进行翻转,次要工作是把翻转后m到n的一段跟链表余下的部分再拼接起来,其中细节是,要确定m的前一个元素和n的后一个元素,使得能够连接起来。
def reversebetween(head,m,n):
dummy=ListNode(0,head)
slow,fast=dummy,dummy
pre_slow=ListNode(0,slow)
next_fast=fast.next
for i in range(m):
pre_slow=pre_slow.next
slow=slow.next
for i in range(n):
next_fast=next_fast.next
fast=fast.next
#接下来我们考虑写一个reverse函数来翻转m到n这一段,
#和题目一方法2中的reverse稍有不同,
#m到n链表的最后一个元素并不是None,而是n元素的下一个元素,
#所以具体写法见下面的reverse函数,
#然后继续完成这个函数
p=reverse(slow,next_fast)
pre_slow.next=p
return dummy.next
def reverse(head,end):
p=head
q=head.next
head.next=end
while q:
r=q.next
q.next=p
p=q
q=r
return p