题目
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
代码
方法一:
重点需要理解的是正确翻转的流程:在链表未被破坏之前保留cur的下一个节点信息->改变cur.next的指向->更新prev的位置->更新cur
bash
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
cur=head
prev=None
while cur:
Next=cur.next # 首先应该保存下一个节点
cur.next=prev # 然后翻转
prev=cur # 然后更新pre
cur=Next # 然后将cur指向没有被改变的下一个节点
return prev # 返回翻转之后的链表的头节点
方法二:递归
主要在于理解什么是递归,递归是怎么运行的,之前上课的时候老师说的一个比喻就是:递归就向打开一扇扇门,到最后一扇之后又从最后一扇门开始关门。也就是说这个代码中就是先反复调用reverseList函数到链表的最后一个元素(满足结束条件),执行head.next.next=head, head.next=None这两句代码,然后轮到倒数第二个元素进行上述操作......
假设原链表:1 -> 2 -> 3 -> 4 -> 5
递归过程:
- 递归至节点5,返回5。
- 节点4处理:5->4->None。
- 节点3处理:5->4->3->None。
- 节点2处理:5->4->3->2->None。
- 节点1处理:5->4->3->2->1->None。
最终链表:5 ->4 ->3 ->2 ->1
bash
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
if head==None or head.next==None:
return head
new_head=self.reverseList(head.next)
head.next.next=head
head.next=None
return new_head