题目简述
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
节点数据结构:
class ListNode:
def __init__(self, val=0, next=None):
self.val = val
self.next = next
思路分析
反转链表,可以选用迭代或递归方式完成。
【迭代】
如果问题 可以通过遍历并在遍历中采用重复的步骤最后得到结果的话,可以采用迭代的方式解决。
【递归】
如果问题(1)可以拆解为层层嵌套的相同性质的子问题,即当前问题是采用同样步骤逻辑处理的子问题的结果来求解,子问题同理;(2)这种拆解存在停止条件,即存在最内层子问题不用继续拆解而可以返回结果。则该问题可以采用递归算法解决。
求解过程就像是将问题由外到内逐层放进栈里,直到最内层子问题放进栈内位于栈顶,可求得结果然后出栈,子问题先出栈,当前问题基于已解决的子问题得到结果,逐个出栈的过程就是外层问题逐渐获得结果的过程,直到栈空,求得原问题的结果。
解法一(迭代)
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
pre = None
cur = head
while cur:
nxt = cur.next # 更改next前需记录原指向
cur.next = pre # 更改待处理节点的next指向
pre = cur # 移动指针pre
cur = nxt # 移动指针cur
retrun pre
解法二(递归)
停止条件:链表没有节点或只有一个节点
拆分问题: 当前问题-head应该被链接到已反转的子链表末尾节点(实际上就是原链表的head.next节点)之后,子问题-将以head.next为头节点的子链表反转,返回新的头节点。
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if not head or not head.next:
return head
newhead = self.reverseList(head.next)
head.next.next = head
head.next = None
return newhead