题目:
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
解题思路:
首先生成一个空列表ar,遍历链表的同时,存入该列表ar,同时指针后移;遍历完后,ar已正序包含链表所有元素,再一次使用list.pop()函数,使每个元素从尾部一个个肆放装进新的列表pr,此时pr则与链表元素顺序反过来。
解决方案(python)
#迭代法
prev=None
cur=head
while(cur!=None):
next=cur.next #用来保存cur指针(保证cur能正常向后移)
cur.next=prev #将cur指向前一个元素(保证最后cur指向空时,pre能往前元素走)
prev=cur #pre往后移动一个元素
cur=next #cur向后移动一个元素
return prev
解法二:递归法
思路2:
判断如果head或head.next为None时,返回head
一直往后递:即p=self.reverseList(head.next),直到递到head为最后一个元素时,head.next满足判断则返回最后一个元素,将head.next指向head(即head.next.next=head),即可将元素往前归,归完一个元素但也需要将head.next=None,使得元素往前归的同时,保证下一个元素为空,才能正常返回元素。
if (head is None) or (head.next is None):
return head
p=self.reverseList(head.next)
head.next.next=head #表示将head.next的指针指向head,让head位置往前一个元素移动
head.next=None #保证head往前移动过程中,后面一个元素为None,才能满足上面的判断句
return p
知识点:
知识1:python中只有None,没有Null
判断语句if (head is None)or (head.next is None)才是正确的,None属于一个空类型,不是布尔型。不能使用if(head)
print(type(None))
print(None)
#输出:
#<class 'NoneType'>
#None
知识2:head.next.next=head #表示将head.next的指针指向head
该题中当前一次递归(此时递归head.next为最后一个元素)完成后,第一轮让head.next.next=head,下一个递归函数括号中的head.next即为倒数第二个元素。才符合逻辑
知识3:
p=self.reverseList(head.next) 递归函数使用方法
此处应该是self.函数名;这个需要根据上面给出的参数名来看。