Lintcode 翻转链表 系列问题

题目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
				
	

猜你喜欢

转载自blog.csdn.net/Bismarckczy/article/details/82872738